| bexp rhs # ValueDefinition
| DATA ID+ (EQUALS constructor (BAR constructor)*)? # DataDefinition
| TYPE ID+ EQUALS type # TypeDefinition
| bexp rhs # ValueDefinition
| DATA ID+ (EQUALS constructor (BAR constructor)*)? # DataDefinition
| TYPE ID+ EQUALS type # TypeDefinition
- = faexp+ # Apply, shift ID, shift LAMBDA,
+ = 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 LET, shift INTEGER, shift BEGIN_STRING,
shift IF, shift MATCH, shift DO,
shift MDO, shift ENFORCE, shift BLANK,
| MATCH exp WITH
LBRACE case (SEMICOLON case)* RBRACE # Match
| (DO | MDO) statements # Do
| (SELECT | SELECT_FIRST | SELECT_DISTINCT)
exp WHERE queryBlock # Select
| ENFORCE queryBlock # Enforce
| MATCH exp WITH
LBRACE case (SEMICOLON case)* RBRACE # Match
| (DO | MDO) statements # Do
| (SELECT | SELECT_FIRST | SELECT_DISTINCT)
exp WHERE queryBlock # Select
| ENFORCE queryBlock # Enforce
| LPAREN symbolWithoutMinus lexp RPAREN # RightSection
| LPAREN lexp symbol RPAREN # LeftSection
| LBRACKET (exp (COMMA exp)*)? RBRACKET # ListLiteral
| LPAREN symbolWithoutMinus lexp RPAREN # RightSection
| LPAREN lexp symbol RPAREN # LeftSection
| LBRACKET (exp (COMMA exp)*)? RBRACKET # ListLiteral
+ | chrQuery IMPLIES chrQuery # CHRStatement
+ | WHEN verboseChrQuery THEN_AFTER_WHEN verboseChrQuery # VerboseCHRStatement
+ | CONSTRAINT ID atype* # ConstraintStatement
+ ;
+
+chrQuery
+ = listQualifier (COMMA listQualifier)* # CHRQuery
+ ;
+
+verboseChrQuery
+ = LBRACE listQualifier (SEMICOLON listQualifier)* RBRACE # VerboseCHRQuery