diff options
author | Nathan Ringo <nathan@remexre.com> | 2024-01-23 23:22:37 -0600 |
---|---|---|
committer | Nathan Ringo <nathan@remexre.com> | 2024-01-23 23:22:37 -0600 |
commit | c2638e5d17b93e79851da8c43a377b7d51e723bc (patch) | |
tree | e4dac1716cd5b0f69b1f53afcbeb61af39ccc8cb /discocaml/ast.ml | |
parent | d32d8e09b5763efda69b93139d29147af7a47e71 (diff) |
Draw edges for the binding structure.
Diffstat (limited to 'discocaml/ast.ml')
-rw-r--r-- | discocaml/ast.ml | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/discocaml/ast.ml b/discocaml/ast.ml index a4e2272..92f368f 100644 --- a/discocaml/ast.ml +++ b/discocaml/ast.ml @@ -266,3 +266,44 @@ let show_expr (expr : expr ast) : string = Pprintast.expression fmt (parsetree_of_expr expr); Format.pp_print_flush fmt (); Buffer.contents buf + +type binders = expr index option array + +let get_binders (ast : expr ast) : binders = + let out = Array.make (Arraylist.length ast.subexprs) None in + let rec loop (env : (string * expr index) list) (i : expr index) : unit = + match get_subexpr ast i with + | App (f, x) -> + loop env f; + loop env x + | Cons (hd, tl) -> + loop env hd; + loop env tl + | If (cond, then_, else_) -> + loop env cond; + loop env then_; + loop env else_ + | Lam (x, b) -> loop ((x, i) :: env) b + | Let (false, name, bound, body) -> + loop env bound; + loop ((name, i) :: env) body + | Let (true, name, bound, body) -> + loop ((name, i) :: env) bound; + loop ((name, i) :: env) body + | Prim (Add, (l, r)) -> + loop env l; + loop env r + | Prim (Sub, (l, r)) -> + loop env l; + loop env r + | Prim (Mul, (l, r)) -> + loop env l; + loop env r + | Prim (RelOp, (_, l, r)) -> + loop env l; + loop env r + | Var name -> out.(i.index) <- List.assoc_opt name env + | Bool _ | Int _ | Nil -> () + in + loop [] ast.root; + out |