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;
+ mutable starstate : Ptset.t option;
}
let dummy_conf = { st_root = -1;
st_univ = -1;
tr_aux = Hashtbl.create 0;
entry_points = [];
contains = None;
+ univ_states = [];
+ starstate = None;
}
(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 -> ()
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
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
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_
tr = Hashtbl.create 5;
tr_aux = Hashtbl.create 5;
entry_points = [];
- contains = None
+ contains = None;
+ univ_states = [];
+ starstate = None;
}
in
let q0 = Ata.mk_state() in
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.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;
+ Ata.sigma = Hashtbl.create 17;
+ Ata.starstate = config.starstate;
},config.entry_points,!contains