1 module List = ListLabels
6 module Sym = Tiger_symbol
16 let rec traverseExp ~(env : env) ~depth (exp : A.exp) =
22 | A.CallExp {func=_; args; pos=_} ->
23 List.iter args ~f:(traverseExp ~env ~depth)
24 | A.OpExp {oper=_; left; right; pos=_} ->
25 traverseExp ~env ~depth left;
26 traverseExp ~env ~depth right
27 | A.RecordExp {fields=field_exps; typ=_; pos=_} ->
28 List.iter field_exps ~f:(fun (_, exp, _) -> traverseExp ~env ~depth exp)
30 List.iter exps ~f:(fun (exp, _) -> traverseExp ~env ~depth exp)
31 | A.AssignExp {var; exp; pos=_} ->
32 traverseVar ~env ~depth var;
33 traverseExp ~env ~depth exp
34 | A.IfExp {test; then'; else'; pos=_} ->
35 traverseExp ~env ~depth test;
36 traverseExp ~env ~depth then';
37 Opt.iter else' ~f:(fun e -> traverseExp ~env ~depth e)
38 | A.WhileExp {test; body; pos=_} ->
39 traverseExp ~env ~depth test;
40 traverseExp ~env ~depth body
41 | A.ForExp {var=_; lo; hi; body; pos=_; escape=_} ->
42 traverseExp ~env ~depth lo;
43 traverseExp ~env ~depth hi;
44 traverseExp ~env ~depth body
47 | A.LetExp {decs; body; pos=_} ->
48 traverseDecs ~env ~depth decs;
49 traverseExp ~env ~depth body
50 | A.ArrayExp {typ=_; size; init; pos=_} ->
51 traverseExp ~env ~depth size;
52 traverseExp ~env ~depth init
54 traverseVar ~env ~depth var
56 and traverseVar ~env ~depth (var : A.var) =
60 | A.FieldVar {var; symbol=_; pos=_} ->
61 traverseVar ~env ~depth var
62 | A.SubscriptVar {var; exp; pos=_} ->
63 traverseVar ~env ~depth var;
64 traverseExp ~env ~depth exp
66 and traverseDecs ~env ~depth (decs : A.dec list) =
67 List.iter decs ~f:(traverseDec ~env ~depth)
68 and traverseDec ~env ~depth (dec : A.dec) =
70 | A.FunDecs fundecs ->
71 List.iter fundecs ~f:(
72 fun (A.FunDec {name=_; params; result=_; body; pos=_}) ->
73 traverseFields ~env ~depth params;
74 traverseExp ~env ~depth body
76 | A.VarDec {name=_; escape=_; typ=_; init; pos=_} ->
77 traverseExp ~env ~depth init
78 | A.TypeDecs typedecs ->
79 List.iter typedecs ~f:(fun (A.TypeDec {name=_; ty; pos=_}) ->
84 | A.RecordTy fields ->
85 traverseFields ~env ~depth fields
88 and traverseFields ~env:_ ~depth:_ fields =
89 List.iter fields ~f:(fun (A.Field {name=_; escape=_; typ=_; pos=_}) -> ())
92 traverseExp ~env:Map.empty ~depth:0 prog