3 module List = ListLabels
6 module Sym = Tiger_symbol
18 ; fields : record_fields
24 | Name of Sym.t * t option ref
26 (Tiger_symbol.t * t) list
31 let new_record ~name ~fields =
34 ; unique = Sym.unique_of_string (Sym.to_string name)
37 let new_array ~name ~ty =
40 ; unique = Sym.unique_of_string (Sym.to_string name)
45 | Name (s1, _) , Name (s2, _) -> Sym.is_equal s1 s2
46 | Record {unique=s1; _}, Record {unique=s2; _} -> Sym.is_equal s1 s2
47 | Record _ , Nil -> true
48 | Nil , Record _ -> true
49 | Array {unique=s1; _}, Array {unique=s2; _} -> Sym.is_equal s1 s2
51 (* The above pattern matching is "fragile" and I'm OK with it.
52 * TODO: Can we ignore the warning locally?
61 let is_array = function
70 let is_record = function
79 let is_name = function
88 let if_record t ~f ~otherwise =
90 | Record {fields; _} ->
100 let if_array t ~f ~otherwise =
112 let to_string = function
116 | Record {unique; _} -> sprintf "Record[%s]" (Sym.to_string unique)
117 | Array {unique; _} -> sprintf "Array[%s]" (Sym.to_string unique)
119 | Name (name, _) -> Sym.to_string name
125 ; ("string" , String)
127 |> List.map ~f:(fun (k, v) -> (Sym.of_string k, v))