implemented while and for loops

This commit is contained in:
Moritz Gmeiner 2024-08-27 01:57:47 +02:00
commit 3bc871d434
4 changed files with 87 additions and 16 deletions

View file

@ -6,13 +6,14 @@ type stmt =
| VarDecl of { name : string; init : expr_node option }
| Block of stmt_node list
| If of { cond : expr_node; then_ : stmt_node; else_ : stmt_node option }
| While of { cond : expr_node; body : stmt_node }
and stmt_node = { stmt : stmt; pos : Error.code_pos }
let rec show_stmt ?(indent = 0) stmt =
let indent_s = String.make indent ' ' in
let show_expr_ind ?(depth = 2) = show_expr ~indent:(indent + depth) in
let show_stmt_ind ?(depth = 2) = show_stmt ~indent:(indent + depth) in
let show_expr_ind ?(add = 2) = show_expr ~indent:(indent + add) in
let show_stmt_ind ?(add = 2) = show_stmt ~indent:(indent + add) in
match stmt with
| Expr expr -> indent_s ^ "Expr\n" ^ show_expr_ind expr.expr
| Print expr -> indent_s ^ "Print\n" ^ show_expr_ind expr.expr
@ -23,13 +24,17 @@ let rec show_stmt ?(indent = 0) stmt =
let stmts_s =
List.fold_left (fun acc stmt -> acc ^ show_stmt_ind stmt.stmt ^ "\n") "" stmts
in
"Block" ^ stmts_s ^ "End"
indent_s ^ "Block\n" ^ stmts_s ^ indent_s ^ "End"
| If { cond; then_; else_ } ->
let cond_s = show_expr_ind cond.expr in
let then_s = show_stmt_ind ~depth:4 then_.stmt in
let else_s = Option.map (fun stmt -> show_stmt_ind ~depth:4 stmt.stmt) else_ in
indent_s ^ "If\n" ^ cond_s ^ "\n" ^ indent_s ^ " Then\n" ^ then_s
let then_s = show_stmt_ind ~add:4 then_.stmt in
let else_s = Option.map (fun stmt -> show_stmt_ind ~add:4 stmt.stmt) else_ in
indent_s ^ "If\n" ^ indent_s ^ " Cond" ^ cond_s ^ "\n" ^ indent_s ^ " Then\n" ^ then_s
^ if Option.is_some else_s then "\n" ^ indent_s ^ " Else\n" ^ Option.get else_s else ""
| While { cond; body } ->
let cond_s = show_expr_ind ~add:4 cond.expr in
let body_s = show_stmt_ind ~add:4 body.stmt in
indent_s ^ "While\n" ^ indent_s ^ " Cond\n" ^ cond_s ^ "\n" ^ indent_s ^ " Body\n" ^ body_s
let show_stmt_node stmt_node = show_stmt stmt_node.stmt
let make_stmt_node (pos : Error.code_pos) (stmt : stmt) : stmt_node = { stmt; pos }
@ -49,3 +54,6 @@ let make_block (pos : Error.code_pos) (stmts : stmt_node list) : stmt_node =
let make_if (pos : Error.code_pos) (cond : expr_node) (then_ : stmt_node) (else_ : stmt_node option)
=
If { cond; then_; else_ } |> make_stmt_node pos
let make_while (pos : Error.code_pos) (cond : expr_node) (body : stmt_node) =
While { cond; body } |> make_stmt_node pos