mlox/lib/stmt.ml
Moritz Gmeiner 77e57cd8c2 global and local variables with scope
also reworked arg parsing, now has --debug flag
2024-08-26 01:58:03 +02:00

44 lines
1.4 KiB
OCaml

open Expr
type stmt =
| Expr of expr_node
| Print of expr_node
| VarDecl of { name : string; init : expr_node option }
| Block of stmt_node list
and stmt_node = { stmt : stmt; pos : Error.code_pos }
let rec show_stmt ?(indent = 0) stmt =
let indent_s = String.make indent ' ' in
match stmt with
| Expr expr -> indent_s ^ "Expr\n" ^ show_expr ~indent:(indent + 2) expr.expr
| Print expr -> indent_s ^ "Print\n" ^ show_expr ~indent:(indent + 2) expr.expr
| VarDecl { name; init } -> (
indent_s ^ "Var " ^ name
^
match init with Some init -> " = \n" ^ show_expr ~indent:(indent + 2) init.expr | None -> "")
| Block stmts ->
let stmts_s =
List.fold_left
(fun acc stmt -> acc ^ show_stmt ~indent:(indent + 2) stmt.stmt ^ "\n")
"" stmts
in
"Block" ^ stmts_s ^ "End"
let show_stmt_node stmt_node = show_stmt stmt_node.stmt
let make_expr_stmt (pos : Error.code_pos) (expr : expr_node) : stmt_node =
let stmt = Expr expr in
{ stmt; pos }
let make_print (pos : Error.code_pos) (expr : expr_node) : stmt_node =
let stmt = Print expr in
{ stmt; pos }
let make_var_decl (pos : Error.code_pos) (name : string) (init : expr_node option) =
let stmt = VarDecl { name; init } in
{ stmt; pos }
let make_block (pos : Error.code_pos) (stmts : stmt_node list) : stmt_node =
let stmt = Block stmts in
{ stmt; pos }