X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fgrammar.ml;h=bca97aae45912ab0ebe4a50d3cd82b345f57732f;hb=be15ae2e9a7f0a1d7dade338529c2f9f207990bb;hp=03e9544e859986aed079eb075dfb798e8d736f5a;hpb=17afdb3ccb907d179f65220d5baea45ad532fc91;p=SXSI%2Fxpathcomp.git diff --git a/src/grammar.ml b/src/grammar.ml index 03e9544..bca97aa 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,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