%{
%}
%token <string> ID STR
- %token LC RC CM SC LP RP AT PC DL FS DQ EOF
- %token AND ATTR ATTRIB DIFF EQ FALSE FUN IN INTER NOT OR PAT REF REFOF
- %token REL SELECT SUB SUPER TRUE UNION WHERE
- %left DIFF
+ %token 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
- %start qstr ref query
- %type <string> qstr
- %type <MathQL.resource_set> query
+ %nonassoc NOT EX IN STR ATTR
+ %start qstr query result
+ %type <string> qstr
+ %type <MathQL.query> query
+ %type <MathQL.result> result
%%
qstr:
- | QT { "" }
- | STR qstr { $1 @ $2 }
+ | DQ { "" }
+ | STR qstr { $1 ^ $2 }
;
svar:
| PC ID { $2 }
vvar:
| DL ID { $2 }
;
- val:
- | MCONCL { MQMConclusion }
- | CONCL { MQConclusion }
- | STR { MQCons $1 }
- | rvar { MQStringRVar $1 }
- | svar { MQStringSVar $1 }
- | func rvar { MQFunc ($1, $2) }
+ qstr_list:
+ | STR CM qstr_list { $1 :: $3 }
+ | STR { [$1] }
;
- boole:
- | TRUE { MQTrue }
- | FALSE { MQFalse }
- | str IS str { MQIs ($1, $3) }
- | NOT boole { MQNot $2 }
- | boole AND boole { MQAnd ($1, $3) }
- | boole OR boole { MQOr ($1, $3) }
- | LPR boole RPR { $2 }
+ vvar_list:
+ | vvar CM vvar_list { $1 :: $3 }
+ | vvar { [$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) }
+ | LC qstr_list RC { MathQL.Const $2 }
+ | LC RC { MathQL.Const [] }
+ | REFOF set_exp { MathQL.RefOf $2 }
+ ;
+ boole_exp:
+ | TRUE { MathQL.True }
+ | FALSE { MathQL.False }
+ | LP boole_exp RP { $2 }
+ | NOT boole_exp { MathQL.Not $2 }
+ | EX boole_exp { MathQL.Ex $2 }
+ | val_exp SUB val_exp { MathQL.Sub ($1, $3) }
+ | val_exp MEET val_exp { MathQL.Meet ($1, $3) }
+ | val_exp EQ val_exp { MathQL.Eq ($1, $3) }
+ | boole_exp AND boole_exp { MathQL.And ($1, $3) }
+ | boole_exp OR boole_exp { MathQL.Or ($1, $3) }
;
- rlist:
- | PATT REF { MQPattern $2 }
- | rlist UNION rlist { MQUnion ($1, $3) }
- | rlist INTER rlist { MQIntersect ($1, $3) }
- | USE rlist POS svar { MQUse ($2, $4) }
- | USEDBY rlist POS svar { MQUsedBy ($2, $4) }
- | SELECT rvar IN rlist WHERE boole { MQSelect ($2, $4, $6) }
- | LPR rlist RPR { $2 }
+ 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.Let ($2, $4, $6) }
;
query:
- rlist EOF { MQList $1 }
+ | set_exp EOF { $1 }
+ ;
+ attribute:
+ | STR IS qstr_list { ($1, $3) }
+ | STR { ($1, []) }
+ ;
+ attr_list:
+ | attribute SC attr_list { $1 :: $3 }
+ | attribute { [$1] }
;
+ group:
+ LC attr_list RC { $2 }
+ ;
+ group_list:
+ | group CM group_list { $1 :: $3 }
+ | group { [$1] }
+ ;
+ resource:
+ | STR ATTR group_list { ($1, $3) }
+ | STR { ($1, []) }
+ ;
+ resource_list:
+ | resource SC resource_list { $1 :: $3 }
+ | resource { [$1] }
+ | { [] }
+ ;
+ result:
+ | resource_list EOF { $1 }