X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Fxpath%2Fxpath_internal_parser.mly;h=a589fde615db58a1b58979608c2e8ff3f2aa9fb3;hp=3651d2cd9e547a0e2ff239bdcbe61c40f64da233;hb=53a0fd29a20e7f4550e0eb5fa5b0d5af6191c36d;hpb=7c1d3641c4c5d7bde075df20863ab4242df3b763 diff --git a/src/xpath/xpath_internal_parser.mly b/src/xpath/xpath_internal_parser.mly index 3651d2c..a589fde 100644 --- a/src/xpath/xpath_internal_parser.mly +++ b/src/xpath/xpath_internal_parser.mly @@ -15,14 +15,15 @@ (***********************************************************************) (* - Time-stamp: + Time-stamp: *) open Ast - let f () = () + open Tree.Common %} %token TAG +%token PI %token ATTNAME %token STRING %token INT @@ -31,7 +32,7 @@ %token RB LB LP RP %token SLASH SLASHSLASH COLONCOLON STAR PIPE %token EQ NEQ LT GT LTE GTE OR AND ADD SUB DIV MOD -%token NODE TEXT +%token NODE TEXT COMMENT %token COMMA %token EOF @@ -69,14 +70,19 @@ simple_path: absolute_path: SLASH relative_path { $2 } -| SLASHSLASH relative_path { $2 @ [(Descendant true, node, [])] } +| SLASHSLASH relative_path { $2 @ + [(Descendant true, + (node, NodeKind.Node), + [])] } ; relative_path: step { [ $1 ] } | relative_path SLASH step { $3 :: $1 } | relative_path SLASHSLASH step { $3 - :: (Descendant true, node, []) + :: (Descendant true, + (node, NodeKind.Node), + []) :: $1 } ; @@ -85,32 +91,45 @@ step: ; axis_test: - AXIS COLONCOLON test { let a, t = $1, $3 in - if a == Attribute && Utils.QNameSet.is_finite t then - (a, Utils.QNameSet.fold - (fun t a -> - Utils.QNameSet.add - (Utils.QName.add_attribute_prefix t) a) - t Utils.QNameSet.empty) - else - (a, t) + AXIS COLONCOLON test { let a, (t,k) = $1, $3 in + let new_t = + if a == Attribute && Utils.QNameSet.is_finite t then + Utils.QNameSet.fold + (fun t a -> + Utils.QNameSet.add + (Utils.QName.attribute t) a) + t Utils.QNameSet.empty + else t + in + (a, (new_t,k)) } | test { Child, $1 } | AXIS { let _ = Format.flush_str_formatter () in let () = Format.fprintf Format.str_formatter "%a" Ast.print_axis $1 in let a = Format.flush_str_formatter () in - Child, Utils.QNameSet.singleton (Utils.QName.of_string a) + Child, (Utils.QNameSet.singleton (Utils.QName.of_string a),NodeKind.Element) } | ATTNAME { (Attribute, - Utils.QNameSet.singleton (Utils.QName.of_string $1)) } + (Utils.QNameSet.singleton (Utils.QName.of_string $1), + NodeKind.Attribute)) } ; test: - NODE { node } -| TEXT { text } -| STAR { star } -| TAG { Utils.QNameSet.singleton(Utils.QName.of_string $1) } + NODE { node, NodeKind.Node } +| TEXT { text, NodeKind.Text } +| STAR { star, NodeKind.Element } +| COMMENT { Utils.QNameSet.singleton(Utils.QName.comment), + NodeKind.Comment + } +| PI { Utils.QNameSet.singleton( + Utils.QName.processing_instruction ( + Utils.QName.of_string $1) + ), NodeKind.ProcessingInstruction + } +| TAG { Utils.QNameSet.singleton(Utils.QName.of_string $1), + NodeKind.Element + } ; pred_list: