X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Fmathql_interpreter%2FmQueryTParser.mly;h=c7df0c9ac8d07d6e9eb1e99df7b58ebe93c1f0cc;hb=b2bde540ce5ec2c8731f0353815583bd3d4eba26;hp=1025cf3167b1e578e4eb7b897de6b0b293fe9d2f;hpb=5bef9ac5a9bfe07b11ce0e44fab51ea4b6eb4057;p=helm.git diff --git a/helm/ocaml/mathql_interpreter/mQueryTParser.mly b/helm/ocaml/mathql_interpreter/mQueryTParser.mly index 1025cf316..c7df0c9ac 100644 --- a/helm/ocaml/mathql_interpreter/mQueryTParser.mly +++ b/helm/ocaml/mathql_interpreter/mQueryTParser.mly @@ -28,11 +28,17 @@ %{ module M = MathQL + module I = M.I + module U = AvsUtil module L = MQILib let make_fun p pl xl = - L.check_arity p (List.length pl) (List.length xl); - M.Fun p pl xl + L.fun_arity p (List.length pl) (List.length xl); + M.Fun (p, pl, xl) + + let make_gen p xl = + L.gen_arity p (List.length xl); + M.Gen (p, xl) let analyze x = let rec join l1 l2 = match l1, l2 with @@ -47,24 +53,27 @@ | head :: tail -> join (f head) (iter f tail) in let rec an_set = function - | M.Const _ + | M.Const x -> iter fv x | M.SVar _ | M.AVar _ - | M.Ex _ -> [] - | M.Dot rv _ -> [rv] - | M.Let _ x y - | M.Select _ x y - | M.For _ _ x y -> iter an_set [x; y] - | M.Fun _ _ l -> iter an_set l - | M.Add _ g x -> join (an_grp g) (an_set x) - | M.Property _ _ _ _ c d _ _ x -> + | M.Ex _ -> [] + | M.Dot (rv, _) -> [rv] + | M.Let (_, x, y) + | M.Select (_, x, y) + | M.For (_, _, x, y) -> iter an_set [x; y] + | M.While (_, x, y) -> iter an_set [x; y] + | M.Fun (_, _, l) -> iter an_set l + | M.Gen (_, l) -> iter an_set l + | M.Add (_, g, x) -> join (an_grp g) (an_set x) + | M.Property (_, _, _, _, c, d, _, _, x) -> join (an_set x) (iter an_con [c; List.concat d]) and fc (_, _, v) = an_set v and an_con c = iter fc c and fg (_, v) = an_set v and an_grp = function | M.Attr g -> iter (iter fg) g - | M.From _ -> [] + | M.From _ -> [] + and fv (_, g) = iter (iter fg) g in an_set x @@ -72,13 +81,16 @@ let s (x, y, z) = y let t (x, y, z) = z %} - %token ID STR - %token LB RB SL IS LC RC CM SC LP RP AT PC FS DQ EOF + %token SVAR AVAR STR + %token LB RB SL LC RC CM SC LP RP FS DQ EOF %token ADD ALIGN AND AS ATTR BE BUT COUNT DIFF DISTR ELSE EMPTY EQ EX - %token FALSE FOR FROM IF IN INF INTER INV ISF IST KEEP LE LET LOG LT - %token MAIN MATCH MEET NOT OF OR PAT PROJ PROP SELECT SOURCE STAT SUB - %token SUP SUPER THEN TRUE UNION WHERE XOR - %nonassoc IN SUP INF ELSE LOG STAT KEEP + %token FALSE FOR FROM GEN IF IN INF INTER INV ISF IST KEEP LE LET LOG LT + %token MAIN MATCH MEET NOT OF OR PAT PEEK PROJ PROP READ RENDER SELECT + %token SEQ SOURCE STAT SUB SUP SUPER THEN TRUE UNION WHERE WHILE XOR + + %nonassoc SOURCE + %right IN SEQ + %nonassoc SUP INF ELSE LOG STAT KEEP RENDER PEEK READ %left DIFF %left UNION %left INTER @@ -99,10 +111,10 @@ | STR qstr { $1 ^ $2 } ; svar: - | PC ID { $2 } + | SVAR { $1 } ; avar: - | AT ID { $2 } + | AVAR { $1 } ; strs: | STR CM strs { $1 :: $3 } @@ -114,11 +126,17 @@ ; path: | SL subpath { $2 } - | SL { [] } +/* | subpath { $1 } +*/ | SL { [] } ; + ppaths: + | path CM ppaths { $1 :: $3 } + | path { [$1] } + ; paths: - | path CM paths { $1 :: $3 } - | path { [$1] } + | ppaths { $1 } + | { [] } + ; inv: | INV { true } | { false } @@ -167,17 +185,6 @@ | PAT { true } | { false } ; - ass: - | set_exp AS path { ($3, $1) } - ; - asss: - | ass CM asss { $1 :: $3 } - | ass { [$1] } - ; - assg: - | asss SC assg { $1 :: $3 } - | asss { [$1] } - ; distr: | DISTR { true } | { false } @@ -198,107 +205,103 @@ | { "text" } ; grp_exp: - | assg { M.Attr $1 } - | avar { M.From $1 } + | x_groups { M.Attr $1 } + | avar { M.From $1 } ; set_exp: - | FALSE - { make_fun ["false"] [] [] } - | TRUE - { make_fun ["true"] [] [] } - | STR - { M.Const [$1, []] } - | LB resources RB - { M.Const $2 } - | avar FS path - { M.Dot $1 $3 } - | LC sets RC - { make_fun ["union"] [] $2 } - | LC RC - { make_fun ["union"] [] [] } - | LP set_exp RP - { $2 } - | STAT set_exp - { make_fun ["stat"] [] [$2] } - | EX set_exp - { M.Ex (analyze $2) $2 } - | NOT set_exp - { make_fun ["not"] [] [$2] } - | PROJ path OF set_exp - { make_fun ["proj"] [$2] [$4] } - | COUNT set_exp - { make_fun ["count"] [] [$2] } - | ALIGN set_exp IN set_exp - { make_fun ["align"] [] [$2; $4] } - | EMPTY - { make_fun ["false"] [] [] } - | svar - { M.SVar $1 } - | avar - { M.AVar $1 } - | LET svar BE set_exp IN set_exp - { M.Let $2 $4 $6 } - | FOR avar IN set_exp gen_op - { M.For (fst $5) $2 $4 (snd $5) } - | ADD distr grp_exp IN set_exp - { M.Add $2 $3 $5 } - | IF set_exp THEN set_exp ELSE set_exp - { make_fun ["diff"] [] [$2; $4; $6] } + | STAT set_exp { make_fun ["stat"] [] [$2] } + | RENDER set_exp { make_fun ["render"] [] [$2] } + | READ set_exp { make_fun ["read"] [] [$2] } + | FALSE { make_fun ["false"] [] [] } + | TRUE { make_fun ["true"] [] [] } + | LC sets RC { make_fun ["union"] [] $2 } + | NOT set_exp { make_fun ["not"] [] [$2] } + | PROJ path OF set_exp { make_fun ["proj"] [$2] [$4] } + | COUNT set_exp { make_fun ["count"] [] [$2] } + | ALIGN set_exp IN set_exp { make_fun ["align"] [] [$2; $4] } + | EMPTY { make_fun ["empty"] [] [] } + | LOG xml source set_exp { make_fun ["log"; $2; $3] [] [$4] } + | KEEP allbut ppaths IN set_exp { make_fun ["keep"; $2] $3 [$5] } + | KEEP allbut set_exp { make_fun ["keep"; $2] [] [$3] } + | path LC paths RC LC sets RC { make_fun $1 $3 $6 } + | set_exp DIFF set_exp { make_fun ["diff"] [] [$1; $3] } + | set_exp UNION set_exp { make_fun ["union"] [] [$1; $3] } + | set_exp INTER set_exp { make_fun ["intersect"] [] [$1; $3] } + | set_exp XOR set_exp { make_fun ["xor"] [] [$1; $3] } + | set_exp OR set_exp { make_fun ["or"] [] [$1; $3] } + | set_exp AND set_exp { make_fun ["and"] [] [$1; $3] } + | set_exp SUB set_exp { make_fun ["sub"] [] [$1; $3] } + | set_exp MEET set_exp { make_fun ["meet"] [] [$1; $3] } + | set_exp EQ set_exp { make_fun ["eq"] [] [$1; $3] } + | set_exp LE set_exp { make_fun ["le"] [] [$1; $3] } + | set_exp LT set_exp { make_fun ["lt"] [] [$1; $3] } + | PEEK set_exp { make_fun ["peek"] [] [$2] } + | IF set_exp THEN set_exp ELSE set_exp + { make_fun ["if"] [] [$2; $4; $6] } + | STR { M.Const [$1, []] } + | LB x_resources RB { M.Const $2 } + | avar FS path { M.Dot ($1, $3) } + | LP set_exp RP { $2 } + | EX set_exp { M.Ex (analyze $2, $2) } + | svar { M.SVar $1 } + | avar { M.AVar $1 } + | LET svar BE set_exp IN set_exp { M.Let (Some $2, $4, $6) } + | set_exp SEQ set_exp { M.Let (None, $1, $3) } + | FOR avar IN set_exp gen_op { M.For (fst $5, $2, $4, snd $5) } + | WHILE set_exp gen_op { M.While (fst $3, $2, snd $3) } + | ADD distr grp_exp IN set_exp { M.Add ($2, $3, $5) } | PROP qualif mainc istrue isfalse attrc OF pattern set_exp - { M.Property (f $2) (s $2) (t $2) $3 $4 $5 $6 $8 $9 } - | LOG xml source set_exp - { make_fun ["log"; $2; $3] [] [$4] } - | KEEP allbut paths IN set_exp - { make_fun ["keep"; $2] $3 [$5] } - | KEEP allbut set_exp - { make_fun ["keep"; $2] [] [$3] } - | SELECT avar FROM set_exp WHERE set_exp - { M.Select $2 $4 $6 } - | path LC paths RC LC sets RC - { make_fun $1 $3 $6 } - | path LC sets RC - { make_fun $1 [] $3 } - | path LC RC - { make_fun $1 [] [] } - | set_exp DIFF set_exp - { make_fun ["diff"] [] [$1; $3] } - | set_exp UNION set_exp - { make_fun ["union"] [] [$1; $3] } - | set_exp INTER set_exp - { make_fun ["intersect"] [] [$1; $3] } - | set_exp XOR set_exp - { make_fun ["xor"] [] [$1; $3] } - | set_exp OR set_exp - { make_fun ["or"] [] [$1; $3] } - | set_exp AND set_exp - { make_fun ["and"] [] [$1; $3] } - | set_exp SUB set_exp - { make_fun ["sub"] [] [$1; $3] } - | set_exp MEET set_exp - { make_fun ["meet"] [] [$1; $3] } - | set_exp EQ set_exp - { make_fun ["eq"] [] [$1; $3] } - | set_exp LE set_exp - { make_fun ["le"] [] [$1; $3] } - | set_exp LT set_exp - { make_fun ["lt"] [] [$1; $3] } + { M.Property (f $2, s $2, t $2, $3, $4, $5, $6, $8, $9) } + | SELECT avar FROM set_exp WHERE set_exp { M.Select ($2, $4, $6) } + | GEN path LC sets RC { make_gen $2 $4 } + | GEN path IN set_exp { make_gen $2 [$4] } ; + psets: + | set_exp CM psets { $1 :: $3 } + | set_exp { [$1] } + ; sets: - | set_exp CM sets { $1 :: $3 } - | set_exp { [$1] } + | psets { $1 } + | { [] } ; query: | set_exp { $1 } | set_exp error { $1 } | EOF { raise End_of_file } ; + + x_attr: + | path BE set_exp { ($1, $3) } + | path { ($1, make_fun ["empty"] [] []) } + ; + x_attrs: + | x_attr SC x_attrs { $1 :: $3 } + | x_attr { [$1] } + ; + x_group: + LC x_attrs RC { $2 } + ; + x_groups: + | x_group CM x_groups { $1 :: $3 } + | x_group { [$1] } + ; + x_resource: + | STR ATTR x_groups { ($1, $3) } + | STR { ($1, []) } + ; + x_resources: + | x_resource SC x_resources { $1 :: $3 } + | x_resource { [$1] } + | { [] } + ; + attr: - | path IS strs { $1, $3 } - | path { $1, [] } + | path BE STR { U.grp_make_x $1 [$3] } + | path BE LC strs RC { U.grp_make_x $1 $4 } ; attrs: - | attr SC attrs { $1 :: $3 } - | attr { [$1] } + | attr SC attrs { I.grp_union $1 $3 } + | attr { $1 } ; group: LC attrs RC { $2 } @@ -308,13 +311,13 @@ | group { [$1] } ; resource: - | STR ATTR groups { ($1, $3) } - | STR { ($1, []) } + | STR ATTR groups { U.make_x $1 $3 } + | STR { U.make_x $1 [] } ; resources: - | resource SC resources { $1 :: $3 } - | resource { [$1] } - | { [] } + | resource SC resources { I.union $1 $3 } + | resource { $1 } + | { U.val_false } ; result: | resources { $1 }