X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fgrammar.ml;fp=src%2Fgrammar.ml;h=cf167fc598046cee45d67249591e385dc557b6d6;hb=6df6ad6cf27e57872bd5891b49354acb0a5ce6a4;hp=03e9544e859986aed079eb075dfb798e8d736f5a;hpb=124b3b4e8f440f8c996263127336377c9456e090;p=SXSI%2Fxpathcomp.git diff --git a/src/grammar.ml b/src/grammar.ml index 03e9544..cf167fc 100644 --- a/src/grammar.ml +++ b/src/grammar.ml @@ -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