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
26
lib/expr.ml
26
lib/expr.ml
|
|
@ -23,13 +23,15 @@ type binary_op =
|
|||
[@@deriving show { with_path = false }]
|
||||
|
||||
type unary_op = Neg | Not [@@deriving show { with_path = false }]
|
||||
type logical_op = And | Or [@@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 }
|
||||
| Unary of { op : unary_op; expr : expr_node }
|
||||
| Binary of { op : binary_op; left : expr_node; right : expr_node }
|
||||
| Logical of { op : logical_op; left : expr_node; right : expr_node }
|
||||
|
||||
and expr_node = { expr : expr; pos : Error.code_pos }
|
||||
|
||||
|
|
@ -39,11 +41,14 @@ let rec show_expr ?(indent = 0) expr =
|
|||
match expr with
|
||||
| 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 } ->
|
||||
| Assignment { name; expr } -> indent_s ^ name ^ " = \n" ^ show_indented expr.expr
|
||||
| Unary { op; expr } -> indent_s ^ show_unary_op op ^ "\n" ^ show_indented expr.expr
|
||||
| Binary { op; left; right } ->
|
||||
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
|
||||
| Logical { op; left; right } ->
|
||||
indent_s ^ show_logical_op op ^ "\n" ^ show_indented left.expr ^ "\n"
|
||||
^ show_indented right.expr
|
||||
|
||||
let show_expr_node expr_node = show_expr expr_node.expr
|
||||
let make_expr_node (pos : Error.code_pos) (expr : expr) : expr_node = { expr; pos }
|
||||
|
|
@ -63,8 +68,11 @@ let make_variable (pos : Error.code_pos) (name : string) : expr_node =
|
|||
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 })
|
||||
|
||||
let make_unary (pos : Error.code_pos) (op : unary_op) (expr : expr_node) =
|
||||
make_expr_node pos (UnaryExpr { op; expr })
|
||||
Unary { op; expr } |> make_expr_node pos
|
||||
|
||||
let make_binary (pos : Error.code_pos) (op : binary_op) (left : expr_node) (right : expr_node) =
|
||||
Binary { op; left; right } |> make_expr_node pos
|
||||
|
||||
let make_logical (pos : Error.code_pos) (op : logical_op) (left : expr_node) (right : expr_node) =
|
||||
Logical { op; left; right } |> make_expr_node pos
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue