diff options
Diffstat (limited to 'discocaml/ast.ml')
-rw-r--r-- | discocaml/ast.ml | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/discocaml/ast.ml b/discocaml/ast.ml index 025fa24..8e9c0c9 100644 --- a/discocaml/ast.ml +++ b/discocaml/ast.ml @@ -20,7 +20,9 @@ type 'a prim = and expr = | App of expr index * expr index + | Bool of bool | Cons of expr index * expr index + | If of expr index * expr index * expr index | Int of int | Lam of string * expr index | Let of bool * string * expr index * expr index @@ -78,6 +80,8 @@ let add_expr_to_ast (ast : 'a ast) : Parsetree.expression -> expr index = -> add (Cons (loop hd, loop tl)) | Pexp_construct ({ txt = Lident "[]"; _ }, None) -> add Nil + | Pexp_construct ({ txt = Lident "false"; _ }, None) -> add (Bool false) + | Pexp_construct ({ txt = Lident "true"; _ }, None) -> add (Bool true) | Pexp_fun (Nolabel, None, arg_pat, body) -> ( match arg_pat.ppat_desc with | Ppat_var { txt = name; _ } -> add (Lam (name, loop body)) @@ -86,6 +90,8 @@ let add_expr_to_ast (ast : 'a ast) : Parsetree.expression -> expr index = | Pexp_ident { txt = Lident "-"; _ } -> binop Sub | Pexp_ident { txt = Lident "*"; _ } -> binop Mul | Pexp_ident { txt = Lident name; _ } -> add (Var name) + | Pexp_ifthenelse (cond, then_, Some else_) -> + add (If (loop cond, loop then_, loop else_)) | Pexp_let ( recursive, [ @@ -153,6 +159,8 @@ let parsetree_of_subexpr (ast : 'a ast) : expr -> Parsetree.expression = let f, xs = list_of_apps expr in let xs = List.map (fun x -> (Asttypes.Nolabel, loop (subexpr x))) xs in Wrap.expression (Pexp_apply (loop f, xs)) + | Bool b -> + Wrap.expression (Pexp_construct (Wrap.ident (string_of_bool b), None)) | Cons (hd, tl) -> Wrap.expression (Pexp_construct @@ -160,6 +168,12 @@ let parsetree_of_subexpr (ast : 'a ast) : expr -> Parsetree.expression = Some (Wrap.expression (Pexp_tuple [ loop (subexpr hd); loop (subexpr tl) ])) )) + | If (cond, then_, else_) -> + Wrap.expression + (Pexp_ifthenelse + ( loop (subexpr cond), + loop (subexpr then_), + Some (loop (subexpr else_)) )) | Int n -> Wrap.expression (Pexp_constant (Pconst_integer (Int.to_string n, None))) | Lam (x, b) -> |