5 module Pos = Tiger_position
6 module Symbol = Tiger_symbol
7 module Translate = Tiger_translate
8 module Type = Tiger_env_type
9 module Value = Tiger_env_value
11 (* The only reason for having this seemingly-superfluous inner module is to
12 * have this nice signature as a summary of what each function does. *)
19 (* Violating normal naming convention just to make it easier to follow
22 val transExp : env:Env.t -> A.exp -> expty
23 val transVar : env:Env.t -> A.var -> expty
24 val transDec : env:Env.t -> A.dec -> Env.t
25 val transTy : env:Env.t -> A.ty -> Type.t (* needs only type env *)
32 let unimplemented () =
33 failwith "unimplemented"
35 (* TODO: Perhaps a wrapper for env.get that raises semantic error if not found *)
37 let transExp ~env:_ exp =
43 | A.StringExp {string=_; _} ->
45 | A.CallExp {func=_; args=_; pos=_} ->
47 | A.OpExp {left=_; oper=_; right=_; pos=_} ->
49 | A.RecordExp {fields=_; typ=_; pos=_} ->
53 | A.AssignExp {var=_; exp=_; _} ->
55 | A.IfExp {test=_; then'=_; else'=_; _} ->
57 | A.WhileExp {test=_; body=_; _} ->
59 | A.ForExp {var=_; lo=_; hi=_; body=_; _} ->
63 | A.LetExp {decs=_; body=_; _} ->
65 | A.ArrayExp {typ=_; size=_; init=_; _} ->
71 let transVar ~env:_ var =
73 | A.SimpleVar {symbol=_; _} ->
75 | A.FieldVar {var=_; symbol=_; _} ->
77 | A.SubscriptVar {var=_; exp=_; _} ->
81 let transDec ~env:_ dec =
83 | A.VarDec {name=_; typ=_; init=_; pos=_; escape=_} ->
91 let transTy ~env:_ typ =
93 | A.NameTy {symbol = _; pos = _} ->
97 | A.ArrayTy {symbol = _; pos = _} ->
102 let transProg absyn =
104 let {exp = _; ty = _} = transExp absyn ~env:Env.base in