Add a kind element to the node tree. Improve support for XPath by
[tatoo.git] / src / xpath / xpath_internal_parser.mly
index 3651d2c..a589fde 100644 (file)
 (***********************************************************************)
 
 (*
-  Time-stamp: <Last modified on 2013-03-10 14:31:48 CET by Kim Nguyen>
+  Time-stamp: <Last modified on 2013-03-13 09:56:09 CET by Kim Nguyen>
 *)
 
   open Ast
-  let f () = ()
+  open Tree.Common
 %}
 
 %token <string> TAG
+%token <string> PI
 %token <string> ATTNAME
 %token <string> STRING
 %token <int>  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: