]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/mathql/mQueryTParser.mly
new semantics for relation and attribute
[helm.git] / helm / ocaml / mathql / mQueryTParser.mly
index 7bb6be3c43484cfebf34e7a020178fa1d3680b19..9af1be4f0d59dc3e3040e63d01671efdd768901c 100644 (file)
 %{
 %}
    %token    <string> ID STR
-   %token    IS LC RC CM SC LP RP AT PC DL FS DQ EOF 
+   %token    SL IS LC RC CM SC LP RP AT PC DL FS DQ EOF 
    %token    AND ATTR ATTRIB BE DIFF EQ EX FALSE FUN IN INTER LET MEET NOT OR
    %token    PAT REF REFOF REL SELECT SUB SUPER TRUE UNION WHERE
    %left     DIFF WHERE REFOF  
    %left     OR UNION
    %left     AND INTER
-   %nonassoc NOT EX IN STR ATTR
+   %nonassoc REL
+   %nonassoc NOT EX IN ATTR
+
    %start    qstr query result
    %type     <string>        qstr      
    %type     <MathQL.query>  query
       | vvar CM vvar_list { $1 :: $3 }
       | vvar              { [$1]     }
    ;
+   qstr_path:
+      | STR SL qstr_path { $1 :: $3 }
+      | STR              { [$1]     } 
+   ;
    ref_op:
       | SUB   { MathQL.SubOp   }
       | SUPER { MathQL.SuperOp }
       |       { MathQL.ExactOp }
    ;
    val_exp:
-      | STR                       { MathQL.Const [$1]             } 
-      | FUN STR val_exp           { MathQL.Fun ($2, $3)           }
-      | ATTRIB ref_op STR val_exp { MathQL.Attribute ($2, $3, $4) }
-      | rvar FS vvar              { MathQL.Record ($1, $3)        }
-      | vvar                      { MathQL.VVar $1                }
-      | LC qstr_list RC           { MathQL.Const $2               }
-      | LC RC                     { MathQL.Const []               }
-      | REFOF set_exp             { MathQL.RefOf $2               }
+      | STR                             { MathQL.Const [$1]             } 
+      | FUN STR val_exp                 { MathQL.Fun ($2, $3)           }
+      | ATTRIB ref_op qstr_path val_exp { MathQL.Attribute ($2, $3, $4) }
+      | rvar FS vvar                    { MathQL.Record ($1, $3)        }
+      | vvar                            { MathQL.VVar $1                }
+      | LC qstr_list RC                 { MathQL.Const $2               }
+      | LC RC                           { MathQL.Const []               }
+      | REFOF set_exp                   { MathQL.RefOf $2               }
    ;
    boole_exp:
       | TRUE                    { MathQL.True          }
       | boole_exp OR boole_exp  { MathQL.Or ($1, $3)   }
    ;   
    set_exp:
-      | REF val_exp                            { MathQL.Ref $2                    }
-      | PAT val_exp                            { MathQL.Pattern $2                } 
-      | LP set_exp RP                          { $2                               }
-      | SELECT rvar IN set_exp WHERE boole_exp { MathQL.Select ($2, $4, $6)       }
-      | REL ref_op STR set_exp ATTR vvar_list  { MathQL.Relation ($2, $3, $4, $6) }
-      | REL ref_op STR set_exp                 { MathQL.Relation ($2, $3, $4, []) }
-      | svar                                   { MathQL.SVar $1                   }
-      | rvar                                   { MathQL.RVar $1                   }
-      | set_exp UNION set_exp                  { MathQL.Union ($1, $3)            }
-      | set_exp INTER set_exp                  { MathQL.Intersect ($1, $3)        }
-      | set_exp DIFF set_exp                   { MathQL.Diff ($1, $3)             }
-      | LET svar BE set_exp IN set_exp         { MathQL.LetSVar ($2, $4, $6)      }      
-      | LET vvar BE val_exp IN set_exp         { MathQL.LetVVar ($2, $4, $6)      }      
+      | REF val_exp                                 { MathQL.Ref $2                    }
+      | PAT val_exp                                 { MathQL.Pattern $2                } 
+      | LP set_exp RP                               { $2                               }
+      | SELECT rvar IN set_exp WHERE boole_exp      { MathQL.Select ($2, $4, $6)       }
+      | REL ref_op qstr_path set_exp ATTR vvar_list { MathQL.Relation ($2, $3, $4, $6) }
+      | REL ref_op qstr_path set_exp                { MathQL.Relation ($2, $3, $4, []) }
+      | svar                                        { MathQL.SVar $1                   }
+      | rvar                                        { MathQL.RVar $1                   }
+      | set_exp UNION set_exp                       { MathQL.Union ($1, $3)            }
+      | set_exp INTER set_exp                       { MathQL.Intersect ($1, $3)        }
+      | set_exp DIFF set_exp                        { MathQL.Diff ($1, $3)             }
+      | LET svar BE set_exp IN set_exp              { MathQL.LetSVar ($2, $4, $6)      }      
+      | LET vvar BE val_exp IN set_exp              { MathQL.LetVVar ($2, $4, $6)      }      
    ;
    query:
       | set_exp EOF { $1 }