2 /******************************************************************************
11 initial equationBlock ;
14 = (declaration (SEMICOLON declaration)*)? # Module
18 = command? # OneCommand
19 | commands SEMICOLON command # ManyCommands
23 = statement # StatementCommand
24 | import # ImportCommand
27 /******************************************************************************
32 = LBRACE (declaration (SEMICOLON declaration)*)? RBRACE # Declarations
36 = var (COMMA var)* HASTYPE type # TypeAnnotation
37 | bexp rhs # ValueDefinition
38 | DATA ID+ (EQUALS constructor (BAR constructor)*)? # DataDefinition
39 | TYPE ID+ EQUALS type # TypeDefinition
42 (WHERE declarations)? # ClassDefinition
43 | INSTANCE context? ID atype+ (WHERE declarations)? # InstanceDefinition
44 | DERIVING INSTANCE context? ID atype+ # DerivingInstanceDefinition
45 | BEGIN_STRING END_STRING # DocumentationString
46 | ANNOTATION_ID aexp* # Annotation
47 | (INFIX | INFIXL | INFIXR) INTEGER var (COMMA var)* # PrecedenceDefinition
49 | IMPORTJAVA BEGIN_STRING END_STRING WHERE declarations # ImportJava
50 | EFFECT ID BEGIN_STRING END_STRING
51 BEGIN_STRING END_STRING # EffectDefinition
52 | (RULE | ABSTRACT_RULE) ID
53 (EXTENDS ID (COMMA ID)*)?
54 WHERE ruleDeclarations # RuleDefinition
55 | MAPPING_RELATION ID atype* # MappingRelationDefinition
56 | bexp FOLLOWS ruleDeclarations # RelationDefinition
61 BEGIN_STRING END_STRING
67 = LPAREN (importItem (COMMA importItem)*)? RPAREN # ImportShowing
68 | HIDING LPAREN (importItem (COMMA importItem)*)? RPAREN # ImportHiding
72 = ID # ImportValueItem
73 // | (TYPE | DATA) ID # ImportTypeItem
74 // | CLASS ID # ImportClassItem
79 = (ANNOTATION_ID aexp)* ID atype* # Constructor
80 | (ANNOTATION_ID aexp)* ID LBRACE
81 fieldDeclaration (COMMA fieldDeclaration)* RBRACE # RecordConstructor
85 = ID HASTYPE type # FieldDescription
88 rhs = EQUALS exp (WHERE statements)? # SimpleRhs
89 | guardedExpEq+ (WHERE statements)? # GuardedRhs
93 = BAR exp (COMMA exp)* EQUALS exp # GuardedExpEq
97 = ID+ ARROW ID # Fundep
101 = fundep (COMMA fundep)* # Fundeps
104 /******************************************************************************
109 = LBRACE (ruleDeclaration (SEMICOLON ruleDeclaration)*)? RBRACE # RuleDeclarations
113 = query # QueryRuleDeclaration
114 | ANNOTATION_ID aexp* # Annotation
117 /******************************************************************************
121 exp = bexp (HASTYPE type)? # LocalTypeAnnotation, shift HASTYPE, shift COLON
122 | bexp COLON ID WITH? queryBlock? # EntityTypeAnnotation, shift LBRACE, shift WITH
126 = MINUS? lexp (symbol lexp)* # Binary, shift MINUS, shift SYMBOL,
127 shift LESS, shift GREATER, shift SEPARATED_DOT,
132 = faexp+ # Apply, shift ID, shift LAMBDA,
133 shift LET, shift INTEGER, shift BEGIN_STRING,
134 shift IF, shift MATCH, shift DO,
135 shift MDO, shift ENFORCE, shift BLANK,
136 shift FLOAT, shift LPAREN, shift LBRACKET,
137 shift ESCAPED_SYMBOL, shift CHAR, shift LBRACE,
138 shift WHEN, shift ATTACHED_HASH,
139 shift SELECT, shift SELECT_FIRST, shift SELECT_DISTINCT,
140 shift TRANSFORMATION, shift EQ
144 = aexp ((ATTACHED_DOT | ATTACHED_HASH) accessor)* # FieldAccess, shift ATTACHED_DOT, shift ATTACHED_HASH
149 | BEGIN_STRING END_STRING # StringAccessor
150 | LPAREN exp RPAREN # ExpAccessor
154 = LAMBDA aexp+ ARROW exp # Lambda, shift HASTYPE
155 | LET statements IN exp # Let, shift HASTYPE
156 | IF exp THEN exp ELSE exp # If, shift HASTYPE
158 LBRACE case (SEMICOLON case)* RBRACE # Match
159 | (DO | MDO) statements # Do
160 | (SELECT | SELECT_FIRST | SELECT_DISTINCT)
161 exp WHERE queryBlock # Select
162 | ENFORCE queryBlock # Enforce
163 | WHEN queryBlock SEMICOLON exp # When
165 | ATTACHED_HASH ID # HashedId
169 | stringLiteral # String
171 | LPAREN (exp (COMMA exp)*)? RPAREN # Tuple
172 | LPAREN symbolWithoutMinus lexp RPAREN # RightSection
173 | LPAREN lexp symbol RPAREN # LeftSection
174 | LBRACKET (exp (COMMA exp)*)? RBRACKET # ListLiteral
175 | LBRACKET exp DOTDOT exp RBRACKET # Range
177 listQualifier (COMMA listQualifier)* RBRACKET # ListComprehension
179 | ID LBRACE (field (COMMA field)*)? RBRACE # Record
180 | TRANSFORMATION ID WHERE queryBlock # Transformation
181 | EQ LBRACE equationBlock RBRACE # Eq
185 = BEGIN_STRING (SUSPEND_STRING exp CONTINUE_STRING)*
186 END_STRING # StringLiteral
190 = LBRACE statement (SEMICOLON statement)* RBRACE # Statements
194 = exp # GuardStatement
195 | exp rhs # LetStatement
196 | exp BINDS exp # BindStatement
197 | exp FOLLOWS queryBlock # RuleStatement
201 = exp # GuardQualifier
202 | exp EQUALS exp # LetQualifier
203 | exp BINDS exp # BindQualifier
204 | THEN exp (BY exp)? # ThenQualifier
212 = ARROW exp (WHERE statements)? # SimpleCaseRhs
213 | guardedExpArrow+ (WHERE statements)? # GuardedCaseRhs
217 = BAR exp (COMMA exp)* ARROW exp # GuardedExpArrow
221 = ID EQUALS exp # Field
222 | ID # FieldShorthand
225 /******************************************************************************
230 = LBRACE (query (SEMICOLON query)*)? RBRACE # QueryBlock
234 = exp # GuardQuery, shift BINDS, shift EQUALS
235 | exp EQUALS exp # EqualsQuery
236 | exp BINDS exp # BindQuery
237 | QUERY_OP queryBlock # CompositeQuery
240 /******************************************************************************
245 = (equation (SEMICOLON equation)*)? # EquationBlock
249 = exp # GuardEquation
250 | exp EQUALS exp # BasicEquation
253 /******************************************************************************
258 = LPAREN type (COMMA type)* RPAREN IMPLIES # Context
262 = etype ((ARROW | IMPLIES) etype)* # Arrow, shift ARROW, shift IMPLIES
266 = LESS ID (COMMA ID)* GREATER btype # Effect
268 | FORALL ID+ (SEPARATED_DOT | ATTACHED_DOT) type # ForAll
272 = atype+ # ApplyType, shift ID, shift LPAREN,
278 | LPAREN (type (COMMA type)*)? RPAREN # TupleType
279 | LBRACKET type RBRACKET # ListType
280 | LBRACKET RBRACKET # ListTypeConstructor
281 | LPAREN COMMA+ RPAREN # TupleTypeConstructor
284 /******************************************************************************
285 * Variables and symbols
289 | ESCAPED_SYMBOL # EscapedSymbol
290 | LPAREN COMMA+ RPAREN # TupleConstructor
295 | ESCAPED_ID # EscapedId
299 | SEPARATED_DOT # Dot
304 | ESCAPED_ID # EscapedId
307 | SEPARATED_DOT # Dot
310 /******************************************************************************
313 dummy = COMMENT EOL ;