Remove hard-coded acess to SXSI for tag operations.
[SXSI/xpathcomp.git] / src / grammar.ml
index 03e9544..cf167fc 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,12 @@ 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 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"
@@ -158,6 +174,7 @@ let load filename bp =
   in
   Unix.close fd;
   traversal g;
+  Tag.init (tag_operations g);
   g