- marking_state, trans2, states2
- | (axis, test, elist) :: ll ->
- let phi0, trans0, states0 =
- compile_rev_axis_test axis QNameSet.any phi_above trans states
- in
- let phi1, trans1, states1 =
- compile_axis_test Self test phi0 trans0 states0
- in
- let phi2, trans2, states2 =
- List.fold_left (fun (aphi, atrans, astates) e ->
- let ephi, etrans, estates = compile_expr e atrans astates in
- aphi %% ephi, etrans, estates) (phi1, trans1, states1) elist
- in
- loop ll trans2 states2 phi2
- | _ -> assert false
+ match ll with
+ [] ->
+ let phi1, trans1, states1 =
+ List.fold_left (fun (aphi, atrans, astates) e ->
+ let ephi, etrans, estates = compile_expr e atrans astates in
+ aphi %% ephi, etrans, estates) (phi0, trans0, states0) elist
+ in
+ let _, trans2, states2 =
+ compile_axis_test Self (test,kind) phi1 trans1 states1
+ in
+ let marking_state =
+ StateSet.choose (StateSet.diff states2 states1)
+ in
+ marking_state, trans2, states2
+ | _ ->
+ let phi1, trans1, states1 =
+ compile_axis_test Self (test,kind) phi0 trans0 states0
+ in
+ let phi2, trans2, states2 =
+ List.fold_left (fun (aphi, atrans, astates) e ->
+ let ephi, etrans, estates = compile_expr e atrans astates in
+ aphi %% ephi, etrans, estates) (phi1, trans1, states1) elist
+ in
+ loop ll trans2 states2 phi2