X-Git-Url: https://git.xandkar.net/?p=tiger.ml.git;a=blobdiff_plain;f=compiler%2Fsrc%2Flib%2Ftiger%2Ftiger_translate.ml;fp=compiler%2Fsrc%2Flib%2Ftiger%2Ftiger_translate.ml;h=f07ec68d42c7b40c09b07d6264a7404627327c88;hp=7f71711273e66877c712e266684ec6f122dba78b;hb=cc540a7e2dfcee4411953075210a64de874b91e5;hpb=21d0f0503ea169988685a4f39d0e32b2b097dae6 diff --git a/compiler/src/lib/tiger/tiger_translate.ml b/compiler/src/lib/tiger/tiger_translate.ml index 7f71711..f07ec68 100644 --- a/compiler/src/lib/tiger/tiger_translate.ml +++ b/compiler/src/lib/tiger/tiger_translate.ml @@ -1 +1,56 @@ +module List = ListLabels + +module Frame = Tiger_frame +module Temp = Tiger_temp + +module Level = struct + type t = + { parent : t option + ; name : Temp.Label.t + ; formals : bool list + ; frame : Frame.t + } + + let init = + let name = Temp.Label.gen () in + let formals = [] in + { parent = None + ; name + ; formals + ; frame = Frame.make ~name ~formals + } + + let next t ~name ~formals = + (* Adding the extra parameter for the static link. See p. 142 *) + let formals = true :: formals in + { parent = Some t + ; name + ; formals + ; frame = Frame.make ~name ~formals + } + + let formals = function {formals; _} -> + formals + + let frame = function {frame; _} -> + frame +end + type exp = unit + +type access = + (* must know about static links *) + { level : Level.t + ; frame_access : Frame.access + } + +let alloc_local ~level ~escapes = + { level + ; frame_access = Frame.alloc_local (Level.frame level) ~escapes + } + +let formals ~level = + (* FIXME: This seems wrong. Should we call Frame.formals? *) + List.map (Level.formals level) ~f:(fun escapes -> + alloc_local ~level ~escapes + )