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"
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"
in
Unix.close fd;
traversal g;
+ Tag.init (tag_operations g);
g