Initial public import
[afterthought.git] / python_dict.ml
1 (* To be cleaned up - prototype version *)
2
3 open Aft_types
4 open Xpath_syntax
5 open Printf
6 open Python
7 open Globals
8
9 let rec squash prefix = function
10     | Slash(Root, e) ->
11         print "Root squash";
12         squash "" e
13     | Slash(e1, e2) ->
14         (squash prefix e1) ^ "." ^ (squash prefix e2)
15     | Axis(_,e)->
16         squash prefix e
17     | Name(s)->
18         s
19     | _ -> print "XPath type not supported.";raise AftError
20
21              (*
22 let serialize_path_existential b xpath_path =
23   let serialize_path_ex' b prefix x =
24       match x with 
25         | Expr(expr) ->
26         | Pipe(e1, e2) ->  
27             print "Pipes not supported"
28             raise AftError
29         | Slash(e1, e2) ->
30             (serialize_xpath e1) ^ (serialize_xpath e2)
31         | Condition(e, expr) ->
32             if (b) then begin print "Double expressions not yet supported";raise AftError end
33                 else
34                    fully_qualify_expr prefix expr
35             eval e
36         | Root ->
37             -1
38         | Axis(_,e)->
39             eval e
40         | Name(s)->
41             let c = String.get s 0 in
42             let ic = int_of_char c in
43               if (ic > 64 && ic < 91) then 1 else 0
44         | _ -> raise AftError
45               *)
46
47 let rec fqe prefix = function
48   | PathExpr(path_expr) -> Var (prefix^"."^squash prefix path_expr)
49   | Equal(e1, e2) -> Equal (fqe prefix e1, fqe prefix e2)
50   | NotEqual(e1, e2) -> NotEqual (fqe prefix e1, fqe prefix e2)
51   | Lower(e1, e2) -> Lower(fqe prefix e1, fqe prefix e2)
52   | Greater(e1, e2) -> Greater(fqe prefix e1, fqe prefix e2)
53   | LowerEqual(e1, e2) -> LowerEqual(fqe prefix e1, fqe prefix e2)
54   | GreaterEqual(e1, e2) -> GreaterEqual(fqe prefix e1, fqe prefix e2)
55   | Plus(e1, e2) -> Plus(fqe prefix e1, fqe prefix e2)
56   | Minus(e1, e2) -> Minus(fqe prefix e1, fqe prefix e2)
57   | Mul(e1, e2) -> Mul(fqe prefix e1, fqe prefix e2)
58   | Div(e1, e2) -> Div(fqe prefix e1, fqe prefix e2)
59   | Mod(e1, e2) -> Mod(fqe prefix e1, fqe prefix e2)
60   | UnaryMinus(e) -> UnaryMinus(fqe prefix e)
61   | Or(e1, e2) -> Or(fqe prefix e1, fqe prefix e2)
62   | And(e1, e2) -> And(fqe prefix e1, fqe prefix e2)
63   | l -> l
64
65 let rec cond_to_expr = function
66     | Slash(Root,e) -> cond_to_expr e
67     | Condition(e, expr) ->
68         let prefix = squash "" e in
69             fqe prefix expr
70     | e -> 
71        Var (squash "" e) 
72
73 let rec from_aft acl =
74   let rec from_aft' l =
75       match l with 
76         | Filter(x) -> Return(fqe "" x)
77         | INF(path, True(l'), False(l'')) ->
78             let cond = cond_to_expr path in
79               If (cond, from_aft(l'), from_aft(l''))
80         | PatternMatch(_) -> print "Expression not reduced";raise AftError
81   in
82     from_aft' acl