Implement the multiple-starters feature:
[tatoo.git] / src / xpath / compile.ml
index 6987b4c..cd887b7 100644 (file)
@@ -236,6 +236,12 @@ let path p =
       nasts) (StateSet.empty, StateSet.empty, [], StateSet.empty) p
   in
   let builder = Ata.Builder.make () in
+  (** ensure that we have a single selecting state at the end *)
+  let phi_sel = StateSet.fold (fun q acc -> F.or_ (F.stay q) acc) mstates F.false_ in
+  let q_sel = State.make () in
+  let states = StateSet.add q_sel states in
+  let mstates = StateSet.singleton q_sel in
+  let trans = (q_sel, [QNameSet.any, phi_sel]) :: trans in
   StateSet.iter
     (Ata.Builder.add_state builder ~starting:true) sstates;
   StateSet.iter