+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
+