X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=xPath.ml;h=4d83634b101a08e5952193881cadeebd94bf98f0;hb=cea756c7adc49891004bfe455628010eb7a28bc9;hp=de9c0567fd5b7a5c3262205f3f70543985fc15fd;hpb=dc91851aaeac91a71eba2c266d0227adea0c5815;p=SXSI%2Fxpathcomp.git diff --git a/xPath.ml b/xPath.ml index de9c056..4d83634 100644 --- 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