= faexp+ # Apply, shift ID, shift LAMBDA, shift LAMBDA_MATCH,
shift LET, shift INTEGER, shift BEGIN_STRING,
shift IF, shift MATCH, shift DO,
- shift MDO, shift ENFORCE, shift BLANK,
+ shift MDO, shift EDO, shift ENFORCE, shift BLANK,
shift FLOAT, shift LPAREN, shift LBRACKET,
shift ESCAPED_SYMBOL, shift CHAR, shift LBRACE,
shift WHEN, shift ATTACHED_HASH,
shift SELECT, shift SELECT_FIRST, shift SELECT_DISTINCT,
- shift TRANSFORMATION, shift EQ
+ shift TRANSFORMATION, shift EQ, shift CHR_SELECT
;
faexp
| IF exp THEN exp (ELSE exp)? # If, shift HASTYPE, shift ELSE
| MATCH exp WITH
LBRACE case (SEMICOLON case)* RBRACE # Match
- | (DO | MDO) statements # Do
+ | (DO | MDO | EDO) statements # Do
| (SELECT | SELECT_FIRST | SELECT_DISTINCT)
exp WHERE queryBlock # Select
+ | CHR_SELECT
+ exp WHERE verboseChrQuery # CHRSelect
| ENFORCE queryBlock # Enforce
//| WHEN queryBlock SEMICOLON exp # When
| var # Var
| exp FOLLOWS queryBlock # RuleStatement
| chrQuery IMPLIES chrQuery # CHRStatement
| WHEN verboseChrQuery THEN_AFTER_WHEN verboseChrQuery # VerboseCHRStatement
- | CONSTRAINT ID atype* # ConstraintStatement
+ | CONSTRAINT constructor # ConstraintStatement
| INCLUDE ID aexp # LocalInclude
;
+verboseChrQuery
+ = LBRACE chrQuery (SEMICOLON chrQuery)* RBRACE # VerboseCHRConjunction
+ ;
+
+
chrQuery
- = listQualifier (COMMA listQualifier)* # CHRQuery
+ = chrQueryPart (COMMA chrQueryPart)* # CHRConjunction
;
-verboseChrQuery
- = LBRACE listQualifier (SEMICOLON listQualifier)* RBRACE # VerboseCHRQuery
+chrQueryPart
+ = exp # CHRAtom
+ | exp EQUALS exp # CHREquals
+ | exp BINDS exp # CHRBinds
;
listQualifier
field
= ID EQUALS exp # Field
| ID # FieldShorthand
+ | DOTDOT # Wildcard
;
/******************************************************************************
atype
= ID # TypeVar
+ | DOUBLE_LESS ID (COMMA ID)* DOUBLE_GREATER # PlainEffect
| LPAREN (type (COMMA type)*)? RPAREN # TupleType
| LBRACKET type RBRACKET # ListType
| LBRACKET RBRACKET # ListTypeConstructor
| MINUS # Minus
| LESS # Less
| GREATER # Greater
+ | DOUBLE_LESS # DoubleLess
+ | DOUBLE_GREATER # DoubleGreater
| SEPARATED_DOT # Dot
;