Simplify the automaton encoding a bit (remove redundant predicates in formulae).
[tatoo.git] / src / xpath / xpath_internal_parser.mly
index a40eea9..6395b6e 100644 (file)
 (*                                                                     *)
 (***********************************************************************)
 
-(*
-  Time-stamp: <Last modified on 2013-03-13 12:38:54 CET by Kim Nguyen>
-*)
-
   open Ast
-  open Tree.Common
+  open Tree
 %}
 
 %token <string> TAG
@@ -30,7 +26,7 @@
 %token <float> FLOAT
 %token <Ast.axis> AXIS
 %token RB LB LP RP
-%token SLASH SLASHSLASH COLONCOLON STAR PIPE
+%token SLASH SLASHSLASH COLONCOLON STAR PIPE DOT DOTDOT
 %token EQ NEQ LT GT LTE GTE OR AND ADD SUB DIV MOD
 %token NODE TEXT COMMENT
 %token COMMA
@@ -91,7 +87,9 @@ relative_path:
 ;
 
 step:
-  axis_test pred_list    {
+  DOT                    { [ (Self, (node, NodeKind.Node), []) ] }
+| DOTDOT                 { [ (Parent, (node, NodeKind.Node), []) ] }
+| axis_test pred_list    {
     match $1 with
       (a,b) :: r -> (a,b,$2) :: (List.map (fun (a,b) -> (a,b,[])) r)
     | [] -> assert false
@@ -101,12 +99,7 @@ step:
 axis_test:
   AXIS COLONCOLON test  { let a, (t,k) = $1, $3 in
                           match a with
-                            Attribute when Utils.QNameSet.is_finite t ->
-                              [ a, ((Utils.QNameSet.fold
-                                       (fun t a ->
-                                         Utils.QNameSet.add
-                                           (Utils.QName.attribute t) a)
-                                       t Utils.QNameSet.empty), k) ]
+                          | Attribute -> [ a, (t, NodeKind.Attribute) ]
                           | Preceding|Following ->
                               [ (Descendant true, (t,k));
                                 if a == Preceding then
@@ -122,27 +115,26 @@ axis_test:
   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),NodeKind.Element)]
+  [Child, (QNameSet.singleton (QName.of_string a),NodeKind.Element)]
 }
 | ATTNAME             {  [(Attribute,
-                           (Utils.QNameSet.singleton (Utils.QName.of_string $1),
+                           (QNameSet.singleton (QName.of_string $1),
                             NodeKind.Attribute))] }
 ;
 
 test:
   NODE                { node, NodeKind.Node }
 | TEXT                { text, NodeKind.Text }
-| STAR                { star, NodeKind.Element }
-| COMMENT             { Utils.QNameSet.singleton(Utils.QName.comment),
+| STAR                { node, NodeKind.Element }
+| COMMENT             { QNameSet.singleton(QName.comment),
                         NodeKind.Comment
                       }
 | PI                  { (if $1 = "" then star
-                         else Utils.QNameSet.singleton(
-                           Utils.QName.processing_instruction (
-                             Utils.QName.of_string $1)
+                         else QNameSet.singleton(
+                             QName.of_string $1
                          )), NodeKind.ProcessingInstruction
                       }
-| TAG                 { Utils.QNameSet.singleton(Utils.QName.of_string $1),
+| TAG                 { QNameSet.singleton(QName.of_string $1),
                         NodeKind.Element
                       }
 ;
@@ -174,7 +166,7 @@ expr:
 | expr LTE expr             { Binop($1, Lte, $3) }
 | expr GT expr              { Binop($1, Gt, $3) }
 | expr GTE expr             { Binop($1, Gte, $3) }
-| TAG LP arg_list RP        { Fun_call(Utils.QName.of_string $1, $3) }
+| TAG LP arg_list RP        { Fun_call(QName.of_string $1, $3) }
 | LP expr RP                { $2 }
 | path                      { Path $1 }
 ;