X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fcompil.ml;h=8044968a23d6c094e3964701c78a16caa1475c82;hb=91c3b3585a018dd5f98949e4838ef3d6c5c120fc;hp=610360bb9dc37751e24644e9d02911cfffbad301;hpb=e80e269c313952b4d427fa6a5a9729ea15e43f39;p=tatoo.git diff --git a/src/compil.ml b/src/compil.ml index 610360b..8044968 100644 --- a/src/compil.ml +++ b/src/compil.ml @@ -16,34 +16,72 @@ open XPath.Ast open Formula.Infix -exception Not_core_XPath of path +exception Not_core_XPath (** Raised whenever the XPath query contains not implemented structures *) +let pr_er = Format.err_formatter + let trans query = let asta = Asta.empty in + (* Buidling of the ASTA step by step with a special case for the last + step. Then add a top most state. Each function modifies asta. *) let rec trans = function | [s] -> trans_last s | s :: tl -> trans_step s; trans tl | [] -> () - and trans_init () = (* add THE top state *) + and trans_init () = (* add THE top most state *) let top_st = Asta.new_state () in let or_top = - List.fold_left (fun acc x -> (`Left *+ x +| acc)) - Formula.true_ (Asta.top_states asta) + List.fold_left (fun acc x -> ((`Left *+ x) +| acc)) + (Formula.false_) (Asta.top_states asta) in + Asta.add_quer asta top_st; + Asta.init_top asta; + Asta.add_top asta top_st; Asta.add_tr asta (top_st, Asta.any_label, or_top) and trans_last (ax,test,pred) = (* a selecting state is needed *) - () - + let fo_p = trans_pr pred in + let q,q' = Asta.new_state(), Asta.new_state() in + Asta.add_selec asta q'; + Asta.add_quer asta q; + Asta.add_quer asta q'; + Asta.add_top asta q; + Asta.add_top asta q'; + Asta.add_bot asta q; + Asta.add_bot asta q'; + let Simple lab = test in + let tr_selec = (q', lab, fo_p) + and tr_q = (q, Asta.any_label, form_propa_selec q q' ax) in + Asta.add_tr asta tr_selec; + Asta.add_tr asta tr_q + and trans_step (ax,test,pred) = () - and trans_pr p = () + and trans_pr = function (* either we apply De Morgan rules + in xPath:parse or here *) + | Expr True -> Formula.true_ + | Expr False -> Formula.false_ + | Or (p_1,p_2) -> trans_pr(p_1) +| trans_pr(p_2) + | And (p_1,p_2) -> trans_pr(p_1) *& trans_pr(p_2) + | Not (Expr Path q) -> Formula.true_ (* todo *) + | Expr Path q -> Formula.true_ (* todo *) + | x -> print_predicate pr_er x; raise Not_core_XPath + + and form_propa q = function + | Child -> `Right *+ q + | Descendant -> (`Left *+ q +| `Right *+ q) + | x -> print_axis pr_er x; raise Not_core_XPath + and form_propa_selec q q' = function + | Child -> `Right *+ q +| `Right *+ q' + | Descendant -> (`Left *+ q +| `Right *+ q) +| (`Left *+ q' +| `Right *+ q') + | x -> print_axis pr_er x; raise Not_core_XPath + in match query with - | Absolute steps -> trans_init(); trans steps; asta - | AbsoluteDoS steps as x -> raise (Not_core_XPath x) - | Relative steps as x -> raise (Not_core_XPath x) + | Absolute steps -> trans steps; trans_init(); asta + | AbsoluteDoS steps as x -> print pr_er x; raise Not_core_XPath + | Relative steps as x -> print pr_er x; raise Not_core_XPath