blob: a13b3f7bf0f9e97e1c7829aee998495f4fe086c8 [file] [log] [blame] [edit]
open Util.Source
module Map = Map.Make(String)
let typids = ref Map.empty
let varids = ref Map.empty
let defids = ref Map.empty
let gramids = ref Map.empty
let fresh_id map s =
if s = "_" then s else
let i =
match Map.find_opt s !map with
| None -> 1
| Some i -> i + 1
in
map := Map.add s i !map;
s ^ "#" ^ string_of_int i
let refresh_id map x =
let s =
match String.rindex_opt x.it '#' with
| None -> x.it
| Some i -> String.sub x.it 0 i
in
fresh_id map s $ x.at
let fresh_typid = fresh_id typids
let fresh_varid = fresh_id varids
let fresh_defid = fresh_id defids
let fresh_gramid = fresh_id gramids
let refresh_typid = refresh_id typids
let refresh_varid = refresh_id varids
let refresh_defid = refresh_id defids
let refresh_gramid = refresh_id gramids
(*
let refresh_quant s q =
match q.it with
| ExpP (x, t) ->
let x' = refresh_varid x in
let t' = Subst.subst_typ s t in
let s' = Subst.add_varid s x (VarE x' $$ x.at % t') in
s', ExpP (x', t') $ q.at
| TypP x ->
let x' = refresh_typid x in
let s' = Subst.add_typid s x (VarT (x', []) $ x.at) in
s', TypP x' $ q.at
| DefP (x, ps, t) ->
let x' = refresh_defid x in
let ps', s' = Subst.subst_params s ps in
let t' = Subst.subst_typ s' t in
let s' = Subst.add_defid s x x' in
s', DefP (x', ps', t') $ q.at
| GramP (x, ps, t) ->
let x' = refresh_gramid x in
let ps', s' = Subst.subst_params s ps in
let t' = Subst.subst_typ s' t in
let s' = Subst.add_gramid s x (VarG (x', []) $ x.at) in
s', GramP (x', ps', t') $ q.at
let refresh_quants qs =
let s, qs' = List.fold_left_map refresh_quant Subst.empty qs in qs', s
*)