X-Git-Url: https://git.xandkar.net/?p=tiger.ml.git;a=blobdiff_plain;f=compiler%2Fsrc%2Flib%2Ftiger%2Ftiger_symbol.ml;fp=compiler%2Fsrc%2Flib%2Ftiger%2Ftiger_symbol.ml;h=b5d895b084b428fb7cb03d0337aae6995d6db0f0;hp=f1dc51a82ea61bf75fc7efa99d967fc85d47934d;hb=35dccbd3999a8c3bb1dc9e96e21b69a39f44fc6f;hpb=e6e82c0866db4eb08f956b2582e5c2ed5399e986 diff --git a/compiler/src/lib/tiger/tiger_symbol.ml b/compiler/src/lib/tiger/tiger_symbol.ml index f1dc51a..b5d895b 100644 --- a/compiler/src/lib/tiger/tiger_symbol.ml +++ b/compiler/src/lib/tiger/tiger_symbol.ml @@ -5,22 +5,30 @@ type t = ; symbol : int } -let nextsym = ref 0 +let counter = ref 0 let symbols = H.create 16 +let next name = + incr counter; + let symbol = !counter in + {name; symbol} + +let new_of_string name = + let t = next name in + H.replace symbols ~key:t.name ~data:t.symbol; + t + let of_string name = match H.find_opt symbols name with - | Some symbol -> - {name; symbol} - | None -> - incr nextsym; - let symbol = !nextsym in - H.replace symbols ~key:name ~data:symbol; - {name; symbol} + | Some s -> {name; symbol=s} + | None -> new_of_string name let to_string {name; _} = name let is_equal {symbol=s1; _} {symbol=s2; _} = s1 = s2 + +let show {name; symbol} = + Printf.sprintf "Symbol[%S, %d]" name symbol