]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/mathql_interpreter/mQueryTParser.mly
patched and new Gen constructor added
[helm.git] / helm / ocaml / mathql_interpreter / mQueryTParser.mly
index da70610655a131396ce98a10405b8cb8308d8bfd..3265a53a874ae680359531f9b71651bb93bb9593 100644 (file)
    module L = MQILib
 
    let make_fun p pl xl = 
-      L.check_arity p (List.length pl) (List.length 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
          | [], _                           -> l2
@@ -56,6 +60,7 @@
         | M.Select _ x y
          | M.For _ _ 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])
    let s (x, y, z) = y
    let t (x, y, z) = z
 %}
-   %token    <string> ID STR
-   %token    LB RB SL IS LC RC CM SC LP RP AT DL FS DQ EOF 
+   %token    <string> 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 SEQ SOURCE STAT 
-   %token    SUB SUP SUPER THEN TRUE UNION WHERE XOR
+   %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 XOR
+
    %nonassoc SOURCE
    %right    IN SEQ
-   %nonassoc SUP INF ELSE LOG STAT KEEP 
+   %nonassoc SUP INF ELSE LOG STAT KEEP RENDER PEEK READ
    %left     DIFF   
    %left     UNION
    %left     INTER
       | STR qstr { $1 ^ $2 }
    ;
    svar:
-      | DL ID { $2 }
+      | SVAR { $1 }
    ;
    avar:
-      | AT ID { $2 }
+      | AVAR { $1 }
    ;
    strs:
       | STR CM strs { $1 :: $3 }
    ;
    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 }
       | 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 ["empty"] [] [] }
-      | 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 SEQ set_exp           { make_fun ["seq"] [] [$1; $3] }
+      | 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 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 $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 }
       | 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 SEQ set_exp
-         { make_fun ["seq"] [] [$1; $3] }
-      | 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] }
+      | 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                }
       | EOF           { raise End_of_file }
    ;
    attr:
-      | path IS strs { $1, $3 }
+      | path BE strs { $1, $3 }
       | path         { $1, [] }
    ;
    attrs: