global and local variables with scope

also reworked arg parsing, now has --debug flag
This commit is contained in:
Moritz Gmeiner 2024-08-26 01:58:03 +02:00
commit 77e57cd8c2
8 changed files with 341 additions and 95 deletions

View file

@ -1,12 +1,12 @@
type literal = String of string | Number of float | Bool of bool | Nil
[@@deriving show { with_path = false }]
(* let show_literal literal =
match literal with
| String s -> s
| Number x -> string_of_float x
| Bool b -> string_of_bool b
| Nil -> "nil" *)
let show_literal literal =
match literal with
| String s -> "\"" ^ s ^ "\""
| Number x -> string_of_float x
| Bool b -> string_of_bool b
| Nil -> "nil"
type binary_op =
| Plus
@ -26,6 +26,8 @@ type unary_op = Neg | Not [@@deriving show { with_path = false }]
type expr =
| Literal of literal
| Variable of string
| Assignment of { name : string; expr : expr_node }
| BinaryExpr of { op : binary_op; left : expr_node; right : expr_node }
| UnaryExpr of { op : unary_op; expr : expr_node }
@ -33,19 +35,33 @@ and expr_node = { expr : expr; pos : Error.code_pos }
let rec show_expr ?(indent = 0) expr =
let show_indented = show_expr ~indent:(indent + 2) in
let ident_s = String.make indent ' ' in
let indent_s = String.make indent ' ' in
match expr with
| Literal literal -> ident_s ^ show_literal literal
| Literal literal -> indent_s ^ show_literal literal
| Variable name -> indent_s ^ "Variable " ^ name
| Assignment { name; expr } -> indent_s ^ name ^ " = \n" ^ show_expr expr.expr ~indent:(indent + 2)
| BinaryExpr { op; left; right } ->
ident_s ^ show_binary_op op ^ "\n" ^ show_indented left.expr ^ "\n" ^ show_indented right.expr
| UnaryExpr { op; expr } -> ident_s ^ show_unary_op op ^ "\n" ^ show_indented expr.expr
indent_s ^ show_binary_op op ^ "\n" ^ show_indented left.expr ^ "\n"
^ show_indented right.expr
| UnaryExpr { op; expr } -> indent_s ^ show_unary_op op ^ "\n" ^ show_indented expr.expr
let show_expr_node expr_node = show_expr expr_node.expr
let make_expr_node (pos : Error.code_pos) (expr : expr) = { expr; pos }
let make_string (pos : Error.code_pos) (s : string) = make_expr_node pos (Literal (String s))
let make_number (pos : Error.code_pos) (x : float) = make_expr_node pos (Literal (Number x))
let make_bool (pos : Error.code_pos) (b : bool) = make_expr_node pos (Literal (Bool b))
let make_nil (pos : Error.code_pos) = make_expr_node pos (Literal Nil)
let make_expr_node (pos : Error.code_pos) (expr : expr) : expr_node = { expr; pos }
let make_string (pos : Error.code_pos) (s : string) : expr_node =
Literal (String s) |> make_expr_node pos
let make_number (pos : Error.code_pos) (x : float) : expr_node =
Literal (Number x) |> make_expr_node pos
let make_bool (pos : Error.code_pos) (b : bool) : expr_node = Literal (Bool b) |> make_expr_node pos
let make_nil (pos : Error.code_pos) = Literal Nil |> make_expr_node pos
let make_variable (pos : Error.code_pos) (name : string) : expr_node =
Variable name |> make_expr_node pos
let make_assignment (pos : Error.code_pos) (name : string) (expr : expr_node) : expr_node =
Assignment { name; expr } |> make_expr_node pos
let make_binary (pos : Error.code_pos) (op : binary_op) (left : expr_node) (right : expr_node) =
make_expr_node pos (BinaryExpr { op; left; right })