aux (x,y)
(* mapping: rule_id -> owned keywords. (rule_id, string list) Hashtbl.t *)
-let owned_keywords = Hashtbl.create 23
+let initial_owned_keywords () = Hashtbl.create 23
+
+let owned_keywords = ref (initial_owned_keywords ())
+
+let history = ref [];;
+
+let push () =
+ history := !owned_keywords :: !history;
+ owned_keywords := (initial_owned_keywords ())
+;;
+
+let pop () =
+ match !history with
+ | [] -> assert false
+ | hd :: old_history ->
+ owned_keywords := hd;
+ history := old_history
+;;
type checked_l1_pattern = CL1P of CicNotationPt.term * int
let keywords = CicNotationUtil.keywords_of_term level1_pattern in
let rule_id = p_atoms in
List.iter CicNotationLexer.add_level2_ast_keyword keywords;
- Hashtbl.add owned_keywords rule_id keywords; (* keywords may be [] *)
+ Hashtbl.add !owned_keywords rule_id keywords; (* keywords may be [] *)
rule_id
let delete rule_id =
let atoms = rule_id in
(try
- let keywords = Hashtbl.find owned_keywords rule_id in
+ let keywords = Hashtbl.find !owned_keywords rule_id in
List.iter CicNotationLexer.remove_level2_ast_keyword keywords
with Not_found -> assert false);
Grammar.delete_rule term atoms