Merged -correctxpath branch
[SXSI/xpathcomp.git] / xPath.ml
index de9c056..4d83634 100644 (file)
--- a/xPath.ml
+++ b/xPath.ml
@@ -229,6 +229,7 @@ type config = { st_root : Ata.state; (* state matching the root element (initial
                tr_aux : (Ata.state,int*(Ata.transition list)) Hashtbl.t;
                mutable entry_points : (Tag.t*Ptset.t) list;
                mutable  contains : string option;
+               mutable univ_states : Ata.state list;
              }
 let dummy_conf = { st_root = -1;
                   st_univ = -1;
@@ -240,6 +241,7 @@ let dummy_conf = { st_root = -1;
                   tr_aux = Hashtbl.create 0;
                   entry_points = [];
                   contains = None;
+                  univ_states = [];
                 }
                   
 
@@ -288,7 +290,7 @@ let or_self conf old_dst q_src q_dst dir test pred mark =
                                (if mark then replace old_dst f else f)
                                *& pred *& 
                                  (if mark then Ata.true_ else (_l dir) ** q_dst),
-                               `True)::acc)
+                               false)::acc)
       l l
     in Hashtbl.replace conf.tr q_src (num,l2)
   with  Not_found -> () 
@@ -340,13 +342,12 @@ let rec compile_step  ?(existential=false) conf q_src dir ctx_path nrec step num
        let _ = if axis=Descendant then
          add_trans num conf.tr_aux (
            ?< q_src><@ ((if ex||nrec then TagSet.diff TagSet.star test
-                         else TagSet.star),false,
-                        `True )>=> `LLeft ** q_src )
+                         else TagSet.star),false)>=> `LLeft ** q_src )
        in        
        let t3 = 
          ?< q_src><@ ((if ex then TagSet.diff TagSet.any test
-                       else TagSet.any), false, `True )>=> 
-           if ex then  ( Ata.atom_ `Left false q_src) *& right ** q_src
+                       else TagSet.any), false)>=> 
+           if ex then  right ** q_src
            else (if axis=Descendant then `RRight else `Right) ** q_src 
        in
        let _ = add_trans num conf.tr_aux t3      
@@ -468,7 +469,7 @@ and compile_expr conf states q_src idx ctx_path dir e qdst =
        let _ = match annot_path with
          | (((Parent|Ancestor|AncestorOrSelf),_,_),_)::_ -> conf.final_state <- Ptset.add qdst conf.final_state
          | _ -> ()
-       in
+       in let _ = conf.univ_states <- a_dst::conf.univ_states in
          (a_st,anc_st,par_st,pre_st,idx, ((ret_dir) ** q))
     | True -> states,Ptset.empty,Ptset.empty,Ptset.empty,idx,Ata.true_
     | False -> states,Ptset.empty,Ptset.empty,Ptset.empty,idx,Ata.false_
@@ -500,7 +501,8 @@ let compile path =
                       tr = Hashtbl.create 5;
                       tr_aux =  Hashtbl.create 5; 
                       entry_points = [];
-                      contains = None
+                      contains = None;
+                      univ_states = [];
                     } 
        in
        let q0 = Ata.mk_state() in
@@ -545,9 +547,8 @@ let compile path =
                 Ata.states = if has_backward then Ptset.add config.st_from_root a_st else a_st;
                 Ata.init = Ptset.singleton config.st_root;
                 Ata.final = Ptset.union anc_st config.final_state;
-                Ata.universal = Ptset.singleton a_dst;
+                Ata.universal = Ptset.add a_dst (Ptset.from_list config.univ_states);
                 Ata.phi = phi;
-                Ata.delta = Hashtbl.create 17;
                 Ata.sigma = Ata.HTagSet.create 17;
               },config.entry_points,!contains