Remove useless cycles in the generated automaton. A state now only has at most one...
authorKim Nguyễn <kn@lri.fr>
Sat, 16 Nov 2013 22:06:32 +0000 (23:06 +0100)
committerKim Nguyễn <kn@lri.fr>
Fri, 22 Nov 2013 14:32:31 +0000 (15:32 +0100)
src/xpath/compile.ml

index 1bfe292..e8ab6fc 100644 (file)
@@ -66,11 +66,10 @@ let compile_axis_test axis (test,kind) phi trans states =
          states)
     | Descendant true ->
         let q' = State.make () in
          states)
     | Descendant true ->
         let q' = State.make () in
-        (F.or_ (F.stay q) (F.first_child q'),
-         (q', [ test => phi;
-               QNameSet.any => F.first_child q' ++ F.next_sibling q';
-             ])::
-         (q, [ test => phi]):: trans,
+        (F.stay q ++ F.first_child q',
+         (q', [ QNameSet.any => F.stay q ++ F.first_child q' ++ F.next_sibling q';
+              ])::
+           (q, [ test => phi]):: trans,
          states)
 
     | Parent ->
          states)
 
     | Parent ->
@@ -82,13 +81,12 @@ let compile_axis_test axis (test,kind) phi trans states =
          (q' @: states))
 
     | Ancestor self ->
          (q' @: states))
 
     | Ancestor self ->
-        let q' = State.make () in
-        let move = F.parent q ++ F.previous_sibling q' in
-        (if self then F.stay q else move),
-        (q, [ test => phi;
-              QNameSet.any => move ])
-        :: (q', [ QNameSet.any => move ]) :: trans,
-        (q' @: states)
+      let q' = State.make () in
+      let move = F.parent q' ++ F.previous_sibling q' in
+      (if self then F.stay q ++ F.stay q' else F.stay q'),
+      (q', [ QNameSet.any => move ++ F.parent q])
+      :: (q, [ test => phi ]) :: trans,
+      (q' @: states)
 
     | FollowingSibling | PrecedingSibling ->
         let move =
 
     | FollowingSibling | PrecedingSibling ->
         let move =