mirror of
https://github.com/MorizzG/MLox.git
synced 2025-12-06 04:22:41 +00:00
implemented while and for loops
This commit is contained in:
parent
6de93de529
commit
3bc871d434
4 changed files with 87 additions and 16 deletions
|
|
@ -9,8 +9,9 @@ open Value
|
|||
let value_of_literal (literal : literal) : Value.lox_value =
|
||||
match literal with String s -> String s | Number x -> Number x | Bool b -> Bool b | Nil -> Nil
|
||||
|
||||
let rec interpret_expr (env : environment) (expr : expr_node) : (lox_value, runtime_error) result =
|
||||
let { pos; expr } = expr in
|
||||
let rec interpret_expr (env : environment) (expr_node : expr_node) :
|
||||
(lox_value, runtime_error) result =
|
||||
let { pos; expr } = expr_node in
|
||||
match expr with
|
||||
| Literal literal -> Ok (value_of_literal literal)
|
||||
| Variable name -> (
|
||||
|
|
@ -75,8 +76,8 @@ let rec interpret_expr (env : environment) (expr : expr_node) : (lox_value, runt
|
|||
| And, false | Or, true -> Ok left (* short circuit *)
|
||||
| _ -> interpret_expr env right)
|
||||
|
||||
let rec interpret_stmt (env : environment) (stmt : stmt_node) : (unit, runtime_error) result =
|
||||
let { pos; stmt } = stmt in
|
||||
let rec interpret_stmt (env : environment) (stmt_node : stmt_node) : (unit, runtime_error) result =
|
||||
let { pos; stmt } = stmt_node in
|
||||
ignore pos;
|
||||
match stmt with
|
||||
| Expr expr ->
|
||||
|
|
@ -108,3 +109,10 @@ let rec interpret_stmt (env : environment) (stmt : stmt_node) : (unit, runtime_e
|
|||
let cond = lox_value_to_bool cond in
|
||||
if cond then interpret_stmt env then_
|
||||
else Option.map (interpret_stmt env) else_ |> Option.value ~default:(Ok ())
|
||||
| While { cond; body } ->
|
||||
let* cond = interpret_expr env cond in
|
||||
let cond = lox_value_to_bool cond in
|
||||
if cond then
|
||||
let* _ = interpret_stmt env body in
|
||||
interpret_stmt env stmt_node
|
||||
else Ok ()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue