Add wrappers for sadakane's data structure.
[SXSI/xpathcomp.git] / src / grammar.ml
index 03e9544..bca97aa 100644 (file)
@@ -24,7 +24,17 @@ type partial = Node of tn_symbol * partial array | Leaf of node
 
 
 external is_nil : t -> t_symbol -> bool = "caml_grammar_is_nil"
-external get_tag : t -> t_symbol -> string = "caml_grammar_get_tag"
+external translate_tag : t -> Tag.t -> Tag.t = "caml_grammar_translate_tag"
+external to_string : t -> Tag.t -> string = "caml_grammar_get_tag"
+external register_tag : t -> string -> Tag.t = "caml_grammar_register_tag"
+
+
+
+let tag_operations t = {
+  Tag.tag = (fun s -> register_tag t s);
+  Tag.to_string = (fun s -> to_string t s);
+  Tag.translate = (fun s -> translate_tag t s);
+}
 
 external get_symbol_at : t -> symbol -> node -> symbol = "caml_grammar_get_symbol_at"
 external first_child : t -> symbol -> node -> node = "caml_grammar_first_child"
@@ -44,6 +54,13 @@ let is_parameter (n : [< any_type ] Node.t) =
   n land 3 == 2
 
 
+let symbol_tag (n : t_symbol) = (Node.to_int n) lsr 2
+;;
+let tag = symbol_tag
+let get_tag g (n : t_symbol) = to_string g (symbol_tag n)
+
+
+
 external parameter : [< any_type ] Node.t -> p_symbol = "%identity"
 external terminal : [< any_type ] Node.t -> t_symbol = "%identity"
 external non_terminal : [< any_type ] Node.t -> n_symbol = "%identity"
@@ -157,7 +174,7 @@ let load filename bp =
     | e -> (Unix.close fd; raise e)
   in
   Unix.close fd;
-  traversal g;
+  Tag.init (tag_operations g);
   g