X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=xPath.ml;h=3fbfacf8718f6acfaed79dbba855a9b16add0f98;hb=22e128466565745a4e74f3b9823e7884ee5c6157;hp=4d83634b101a08e5952193881cadeebd94bf98f0;hpb=7489c542a7b7357a1c2bbc436d1d77c601833d3b;p=SXSI%2Fxpathcomp.git diff --git a/xPath.ml b/xPath.ml index 4d83634..3fbfacf 100644 --- a/xPath.ml +++ b/xPath.ml @@ -230,6 +230,7 @@ type config = { st_root : Ata.state; (* state matching the root element (initial mutable entry_points : (Tag.t*Ptset.t) list; mutable contains : string option; mutable univ_states : Ata.state list; + mutable starstate : Ptset.t option; } let dummy_conf = { st_root = -1; st_univ = -1; @@ -242,6 +243,7 @@ let dummy_conf = { st_root = -1; entry_points = []; contains = None; univ_states = []; + starstate = None; } @@ -326,15 +328,18 @@ let rec compile_step ?(existential=false) conf q_src dir ctx_path nrec step num in let new_st,new_dst, new_ctx = match axis with - | Child | Descendant -> + if (TagSet.is_finite test) + then conf.entry_points <- (TagSet.choose test,Ptset.singleton q_src)::conf.entry_points; let left,right = if nrec then `LLeft,`RRight else `Left,`Right in - + let _ = if is_last && axis=Descendant && TagSet.equal test TagSet.star + then conf.starstate <- Some(Ptset.singleton q_src) + in let t1 = ?< q_src><(test, is_last && not(ex))>=> - p_f *& ( if false (*is_last*) then Ata.true_ else (_l left) ** q_dst) in + p_f *& ( if is_last then Ata.true_ else (_l left) ** q_dst) in let _ = add_trans num conf.tr t1 in @@ -503,6 +508,7 @@ let compile path = entry_points = []; contains = None; univ_states = []; + starstate = None; } in let q0 = Ata.mk_state() in @@ -544,12 +550,13 @@ let compile path = let s = Ptset.union anc_st (Ptset.from_list []) in if has_backward then Ptset.add config.st_from_root s else s in { Ata.id = Oo.id (object end); - Ata.states = if has_backward then Ptset.add config.st_from_root a_st else a_st; + Ata.states = Hashtbl.fold (fun q _ acc -> Ptset.add q acc) phi Ptset.empty; Ata.init = Ptset.singleton config.st_root; Ata.final = Ptset.union anc_st config.final_state; Ata.universal = Ptset.add a_dst (Ptset.from_list config.univ_states); Ata.phi = phi; - Ata.sigma = Ata.HTagSet.create 17; + Ata.sigma = Hashtbl.create 17; + Ata.starstate = config.starstate; },config.entry_points,!contains