Simplify the automaton encoding a bit (remove redundant predicates in formulae).
[tatoo.git] / src / xpath / ast.ml
index d70227b..5b322a4 100644 (file)
 (*                                                                     *)
 (***********************************************************************)
 
-(*
-  Time-stamp: <Last modified on 2013-03-04 16:24:20 CET by Kim Nguyen>
-*)
-
-open Utils
-
 type path = single_path list
 and single_path = Absolute of step list | Relative of step list
 and step = axis * test * expr list
@@ -30,7 +24,7 @@ and axis = Self | Attribute | Child
            | PrecedingSibling
            | Preceding | Following
 
-and test = QNameSet.t
+and test = QNameSet.t * Tree.NodeKind.t
 
 and binop = Eq | Neq | Lt | Gt | Lte | Gte | Or | And | Add | Sub | Mult | Div | Mod
 and unop =  Neg
@@ -52,7 +46,6 @@ let star =
   QNameSet.complement (
     QNameSet.from_list [ QName.text;
                          QName.document;
-                         QName.cdata_section;
                          QName.comment])
 
 
@@ -128,18 +121,25 @@ and print_axis fmt a = pp fmt "%s" begin
   | Following -> "following"
 end
 
-and print_test fmt ts =
-  try
-    pp fmt "%s" (List.assoc ts
-                   [ text,"text()";
-                     node,"node()";
-                     star, "*" ] )
-  with
-    Not_found -> pp fmt "%s"
-      (if QNameSet.is_finite ts
-       then QName.to_string (QNameSet.choose ts)
-       else "<INFINITE>"
-      )
+and print_test fmt (ts,kind) =
+  let open Tree.NodeKind in
+    match kind with
+      Text -> pp fmt "%s" "text()"
+    | Element | Attribute ->
+        pp fmt "%s" begin
+          if QNameSet.is_finite ts then
+            QName.to_string (QNameSet.choose ts)
+          else "*"
+        end
+    | Comment -> pp fmt "%s" "comment()"
+    | ProcessingInstruction ->
+        pp fmt "processing-instruction(%s)"
+          begin
+            if ts == star then ""
+            else "\"" ^ (QName.to_string  (QNameSet.choose ts)) ^ "\""
+          end
+    | Node -> pp fmt "%s" "node()"
+    | Document -> pp fmt "%s" "<DOCUMENT>"
 
 and print_expr fmt = function
 | Number (`Int(i)) -> pp fmt "%i" i
@@ -171,7 +171,8 @@ and print_expr fmt = function
 
 
 let invert_axis = function
-| Self | Attribute as a -> a
+| Self -> Self
+| Attribute -> Parent (* Improve *)
 | Child -> Parent
 | Descendant (b) -> Ancestor (b)
 | FollowingSibling -> PrecedingSibling
@@ -181,4 +182,3 @@ let invert_axis = function
 | Preceding -> Following
 | Following -> Preceding
 ;;
-