mirror of
https://github.com/MorizzG/MLox.git
synced 2025-12-06 04:22:41 +00:00
added If, And, Or
This commit is contained in:
parent
77e57cd8c2
commit
dbcdbc216f
5 changed files with 120 additions and 58 deletions
|
|
@ -28,7 +28,18 @@ let rec interpret_expr (env : environment) (expr : expr_node) : (lox_value, runt
|
|||
let* value = interpret_expr env expr in
|
||||
Env.update env name value;
|
||||
Ok value
|
||||
| BinaryExpr { op; left; right } -> (
|
||||
| Unary { op; expr } -> (
|
||||
let* expr = interpret_expr env expr in
|
||||
match (op, expr) with
|
||||
| Neg, Number x -> Ok (Number (-.x))
|
||||
| Not, Bool b -> Ok (Bool (not b))
|
||||
| _, _ ->
|
||||
let msg =
|
||||
Printf.sprintf "Invalid operant of type %s to operator %s"
|
||||
(type_string_of_lox_value expr) (show_unary_op op)
|
||||
in
|
||||
Error (RuntimeError.make pos msg))
|
||||
| Binary { op; left; right } -> (
|
||||
let* left = interpret_expr env left in
|
||||
let* right = interpret_expr env right in
|
||||
match (left, op, right) with
|
||||
|
|
@ -58,17 +69,11 @@ let rec interpret_expr (env : environment) (expr : expr_node) : (lox_value, runt
|
|||
(type_string_of_lox_value left) (type_string_of_lox_value right) (show_binary_op op)
|
||||
in
|
||||
Error { pos; msg })
|
||||
| UnaryExpr { op; expr } -> (
|
||||
let* expr = interpret_expr env expr in
|
||||
match (op, expr) with
|
||||
| Neg, Number x -> Ok (Number (-.x))
|
||||
| Not, Bool b -> Ok (Bool (not b))
|
||||
| _, _ ->
|
||||
let msg =
|
||||
Printf.sprintf "Invalid operant of type %s to operator %s"
|
||||
(type_string_of_lox_value expr) (show_unary_op op)
|
||||
in
|
||||
Error (RuntimeError.make pos msg))
|
||||
| Logical { op; left; right } -> (
|
||||
let* left = interpret_expr env left in
|
||||
match (op, lox_value_to_bool left) with
|
||||
| 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
|
||||
|
|
@ -98,3 +103,8 @@ let rec interpret_stmt (env : environment) (stmt : stmt_node) : (unit, runtime_e
|
|||
| [] -> Ok ()
|
||||
in
|
||||
_interpret stmts
|
||||
| If { cond; then_; else_ } ->
|
||||
let* cond = interpret_expr env cond in
|
||||
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 ())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue