mirror of
https://github.com/MorizzG/MLox.git
synced 2025-12-06 04:22:41 +00:00
moved exprs into nodes with code position
This commit is contained in:
parent
485ecebdf3
commit
a8290a4104
6 changed files with 155 additions and 49 deletions
41
lib/expr.ml
41
lib/expr.ml
|
|
@ -8,16 +8,28 @@ let show_literal literal =
|
|||
| Bool b -> string_of_bool b
|
||||
| Nil -> "nil"
|
||||
|
||||
type binary_op = Plus | Minus | Mul | Div | Equal | Less | Greater | LessEqual | GreaterEqual
|
||||
type binary_op =
|
||||
| Plus
|
||||
| Minus
|
||||
| Mul
|
||||
| Div
|
||||
| Equal
|
||||
| Less
|
||||
| Greater
|
||||
| LessEqual
|
||||
| GreaterEqual
|
||||
| And
|
||||
| Or
|
||||
[@@deriving show { with_path = false }]
|
||||
|
||||
type unary_op = Neg | Not [@@deriving show { with_path = false }]
|
||||
|
||||
type expr =
|
||||
| Literal of literal
|
||||
| BinaryExpr of { op : binary_op; left : expr; right : expr }
|
||||
| UnaryExpr of { op : unary_op; expr : expr }
|
||||
(* [@@deriving show { with_path = false }] *)
|
||||
| BinaryExpr of { op : binary_op; left : expr_node; right : expr_node }
|
||||
| UnaryExpr of { op : unary_op; expr : expr_node }
|
||||
|
||||
and expr_node = { expr : expr; pos : Error.code_pos }
|
||||
|
||||
let rec show_expr ?(indent = 0) expr =
|
||||
let show_indented = show_expr ~indent:(indent + 2) in
|
||||
|
|
@ -25,12 +37,17 @@ let rec show_expr ?(indent = 0) expr =
|
|||
match expr with
|
||||
| Literal literal -> ident_s ^ show_literal literal
|
||||
| BinaryExpr { op; left; right } ->
|
||||
ident_s ^ show_binary_op op ^ "\n" ^ show_indented left ^ "\n" ^ show_indented right
|
||||
| UnaryExpr { op; expr } -> ident_s ^ show_unary_op op ^ "\n" ^ show_indented expr
|
||||
ident_s ^ show_binary_op op ^ "\n" ^ show_indented left.expr ^ "\n" ^ show_indented right.expr
|
||||
| UnaryExpr { op; expr } -> ident_s ^ show_unary_op op ^ "\n" ^ show_indented expr.expr
|
||||
|
||||
let make_string (s : string) = Literal (String s)
|
||||
let make_number (x : float) = Literal (Number x)
|
||||
let make_bool (b : bool) = Literal (Bool b)
|
||||
let make_nil () = Literal Nil
|
||||
let make_binary (op : binary_op) (left : expr) (right : expr) = BinaryExpr { op; left; right }
|
||||
let make_unary (op : unary_op) (expr : expr) = UnaryExpr { op; expr }
|
||||
let make_expr_node (pos : Error.code_pos) (expr : expr) = { expr; pos }
|
||||
let make_string (pos : Error.code_pos) (s : string) = make_expr_node pos (Literal (String s))
|
||||
let make_number (pos : Error.code_pos) (x : float) = make_expr_node pos (Literal (Number x))
|
||||
let make_bool (pos : Error.code_pos) (b : bool) = make_expr_node pos (Literal (Bool b))
|
||||
let make_nil (pos : Error.code_pos) = make_expr_node pos (Literal Nil)
|
||||
|
||||
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 })
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue