1 package org.simantics.scl.compiler.internal.parsing.parser;
\r
3 import java.io.DataInputStream;
\r
4 import java.io.IOException;
\r
5 import java.util.ArrayList;
\r
6 import java.util.Arrays;
\r
7 import java.util.Collections;
\r
8 import org.simantics.scl.compiler.internal.parsing.exceptions.SCLSyntaxErrorException;
\r
10 import org.simantics.scl.compiler.internal.parsing.Token;
\r
12 public abstract class SCLParser {
\r
13 public static final boolean TRACE = false;
\r
15 private static final int INITIAL_CAPACITY = 16;
\r
16 private static final int STATE_COUNT = 344;
\r
17 private static final int TERMINAL_COUNT = 82;
\r
18 private static final int NONTERMINAL_COUNT = 51;
\r
19 private static final int PRODUCT_COUNT = 132;
\r
21 private static final int[] ACTION_ROW_ID = new int[STATE_COUNT];
\r
22 private static final int[] ACTION_COLUMN_ID = new int[TERMINAL_COUNT];
\r
23 private static final short[] ACTION_TABLE = new short[6120];
\r
24 private static final int[] ERROR_TABLE = new int[882];
\r
25 private static final int[] GOTO_ROW_ID = new int[STATE_COUNT];
\r
26 private static final int[] GOTO_COLUMN_ID = new int[NONTERMINAL_COUNT];
\r
27 private static final short[] GOTO_TABLE = new short[1829];
\r
28 private static final int[] PRODUCT_LHS = new int[PRODUCT_COUNT];
\r
30 private static final short STATE_MASK = (short)0x0fff;
\r
31 private static final short REDUCE_MASK = (short)0x8000;
\r
32 private static final short POP_MASK = (short)0x4000;
\r
33 private static final short PUSH_MASK = (short)0x2000;
\r
34 private static final short ERROR_ACTION = (short)0xffff;
\r
35 private static final short ACCEPT_ACTION = (short)0xfffe;
\r
37 public static final String[] TERMINAL_NAMES = new String[] {
\r
122 public static final String[] NONTERMINAL_NAMES = new String[] {
\r
141 "ruleDeclarations",
\r
144 "fieldDeclaration",
\r
157 "symbolWithoutMinus",
\r
178 DataInputStream input = new DataInputStream(SCLParser.class.getResourceAsStream("SCLParser.dat"));
\r
179 for(int i=0;i<ACTION_ROW_ID.length;++i)
\r
180 ACTION_ROW_ID[i] = input.readInt();
\r
181 for(int i=0;i<ACTION_COLUMN_ID.length;++i)
\r
182 ACTION_COLUMN_ID[i] = input.readInt();
\r
183 for(int i=0;i<ACTION_TABLE.length;++i)
\r
184 ACTION_TABLE[i] = input.readShort();
\r
185 for(int i=0;i<ERROR_TABLE.length;++i)
\r
186 ERROR_TABLE[i] = input.readInt();
\r
187 for(int i=0;i<GOTO_ROW_ID.length;++i)
\r
188 GOTO_ROW_ID[i] = input.readInt();
\r
189 for(int i=0;i<GOTO_COLUMN_ID.length;++i)
\r
190 GOTO_COLUMN_ID[i] = input.readInt();
\r
191 for(int i=0;i<GOTO_TABLE.length;++i)
\r
192 GOTO_TABLE[i] = input.readShort();
\r
193 for(int i=0;i<PRODUCT_LHS.length;++i)
\r
194 PRODUCT_LHS[i] = input.readInt();
\r
196 } catch(IOException e) {
\r
197 e.printStackTrace();
\r
201 private static short getAction(int state, int symbol) {
\r
202 int id = TERMINAL_COUNT*state + symbol;
\r
203 if( ((ERROR_TABLE[id>>5] >> (id&31))&1) != 0 )
\r
204 return ERROR_ACTION;
\r
205 return ACTION_TABLE[ACTION_ROW_ID[state] + ACTION_COLUMN_ID[symbol]];
\r
208 private static short getGoto(int state, int symbol) {
\r
209 return GOTO_TABLE[GOTO_ROW_ID[state] + GOTO_COLUMN_ID[symbol]];
\r
212 protected abstract Token nextToken();
\r
214 private Object[] symbolStack = new Object[INITIAL_CAPACITY];
\r
215 private int symbolStackLength = 0;
\r
217 private int[] stateStack = new int[INITIAL_CAPACITY];
\r
218 private int[] symbolStackPositionStack = new int[INITIAL_CAPACITY];
\r
219 private int stateStackLength = 0;
\r
222 private int reductionLength;
\r
224 protected int length() {
\r
225 return reductionLength;
\r
228 protected Object get(int i) {
\r
229 if(i < 0 || i >= reductionLength)
\r
230 throw new IndexOutOfBoundsException();
\r
231 return symbolStack[symbolStackLength+i];
\r
234 private String parseErrorDescription(int state, Token token, int tokenId) {
\r
235 StringBuilder b = new StringBuilder();
\r
236 b.append("Unexpected token '").append(token)
\r
237 .append("' (").append(TERMINAL_NAMES[tokenId])
\r
238 .append("). Expected one of ");
\r
239 ArrayList<String> possibleTerminals = new ArrayList<String>();
\r
240 for(int i=0;i<TERMINAL_COUNT;++i)
\r
241 if(getAction(state, i) != ERROR_ACTION)
\r
242 possibleTerminals.add(TERMINAL_NAMES[i]);
\r
243 Collections.sort(possibleTerminals);
\r
244 for(int i=0;i<possibleTerminals.size();++i) {
\r
247 b.append(possibleTerminals.get(i));
\r
250 return b.toString();
\r
253 protected abstract RuntimeException syntaxError(Token token, String description);
\r
255 private static String describeAction(int action) {
\r
256 if(action == ERROR_ACTION)
\r
258 if(action == ACCEPT_ACTION)
\r
260 StringBuilder b = new StringBuilder();
\r
261 if((action & REDUCE_MASK) != 0) {
\r
262 action ^= REDUCE_MASK;
\r
263 b.append("REDUCE");
\r
267 if((action & POP_MASK) != 0) {
\r
268 action ^= POP_MASK;
\r
271 if((action & PUSH_MASK) != 0) {
\r
272 action ^= PUSH_MASK;
\r
275 b.append(' ').append(action);
\r
276 return b.toString();
\r
279 private Object parse(int state) {
\r
281 Token token = nextToken();
\r
282 int tokenId = token.id;
\r
284 short action = getAction(state, tokenId);
\r
286 System.out.println("state=" + state + ", tokenId=" + TERMINAL_NAMES[tokenId] +
\r
287 ", action=" + describeAction(action));
\r
288 System.out.print(" ");
\r
289 for(int i=symbolStackLength-1,j=stateStackLength-1;i>=0;--i) {
\r
290 Object s = symbolStack[i];
\r
291 if(s instanceof Token)
\r
292 System.out.print(" " + TERMINAL_NAMES[((Token)s).id]);
\r
294 System.out.print(" " + s.getClass().getSimpleName());
\r
295 while(j>=0 && symbolStackPositionStack[j]==i)
\r
296 System.out.print(" (" + stateStack[j--] + ")");
\r
298 System.out.println();
\r
300 //System.out.println(STATE_DESCRIPTIONS[state]);
\r
301 if((action & REDUCE_MASK) != 0) {
\r
302 if(action == ACCEPT_ACTION)
\r
303 return symbolStack[symbolStackLength-1];
\r
304 if(action == ERROR_ACTION)
\r
305 throw syntaxError(token, parseErrorDescription(state, token, tokenId));
\r
306 stateStackLength -= (action >>> 13)&3;
\r
307 action &= STATE_MASK;
\r
309 int reductionBegin = symbolStackPositionStack[--stateStackLength];
\r
311 reductionLength = symbolStackLength-reductionBegin;
\r
312 symbolStackLength = reductionBegin;
\r
314 if(symbolStackLength == symbolStack.length)
\r
315 symbolStack = Arrays.copyOf(symbolStack, symbolStackLength*2);
\r
316 Object symbol = reduce(action);
\r
317 postReduce(symbol);
\r
318 symbolStack[symbolStackLength] = symbol;
\r
320 state = stateStack[stateStackLength];
\r
321 action = getGoto(state, PRODUCT_LHS[action]);
\r
323 if((action & POP_MASK) != 0) {
\r
324 --stateStackLength;
\r
327 if((action & PUSH_MASK) != 0) {
\r
328 if(stateStackLength == stateStack.length) {
\r
329 stateStack = Arrays.copyOf(stateStack, stateStackLength*2);
\r
330 symbolStackPositionStack = Arrays.copyOf(symbolStackPositionStack, stateStackLength*2);
\r
332 symbolStackPositionStack[stateStackLength] = symbolStackLength;
\r
333 stateStack[stateStackLength++] = state;
\r
335 state = action & STATE_MASK;
\r
336 ++symbolStackLength;
\r
340 if((action & POP_MASK) != 0) {
\r
341 --stateStackLength;
\r
344 if((action & PUSH_MASK) != 0) {
\r
345 if(stateStackLength == stateStack.length) {
\r
346 stateStack = Arrays.copyOf(stateStack, stateStackLength*2);
\r
347 symbolStackPositionStack = Arrays.copyOf(symbolStackPositionStack, stateStackLength*2);
\r
349 symbolStackPositionStack[stateStackLength] = symbolStackLength;
\r
350 stateStack[stateStackLength++] = state;
\r
354 state = action & STATE_MASK;
\r
357 if(symbolStackLength == symbolStack.length)
\r
358 symbolStack = Arrays.copyOf(symbolStack, symbolStackLength*2);
\r
359 symbolStack[symbolStackLength++] = token;
\r
366 public Object parseModule() {
\r
369 public Object parseCommands() {
\r
372 public Object parseImport() {
\r
375 public Object parseType() {
\r
378 public Object parseExp() {
\r
381 public Object parseEquationBlock() {
\r
386 protected Object reduce(int productionId) {
\r
388 switch(productionId) {
\r
390 return reduceModule();
\r
392 return reduceOneCommand();
\r
394 return reduceManyCommands();
\r
396 return reduceImport();
\r
398 return reduceArrow();
\r
400 return reduceLocalTypeAnnotation();
\r
402 return reduceEntityTypeAnnotation();
\r
404 return reduceEquationBlock();
\r
406 return reduceTypeAnnotation();
\r
408 return reduceValueDefinition();
\r
410 return reduceDataDefinition();
\r
412 return reduceTypeDefinition();
\r
414 return reduceClassDefinition();
\r
416 return reduceInstanceDefinition();
\r
418 return reduceDerivingInstanceDefinition();
\r
420 return reduceDocumentationString();
\r
422 return reduceAnnotation();
\r
424 return reducePrecedenceDefinition();
\r
426 return reduceJustImport();
\r
428 return reduceImportJava();
\r
430 return reduceEffectDefinition();
\r
432 return reduceRuleDefinition();
\r
434 return reduceMappingRelationDefinition();
\r
436 return reduceRelationDefinition();
\r
438 return reduceStatementCommand();
\r
440 return reduceImportCommand();
\r
442 return reduceGuardStatement();
\r
444 return reduceLetStatement();
\r
446 return reduceBindStatement();
\r
448 return reduceRuleStatement();
\r
450 return reduceCHRStatement();
\r
452 return reduceVerboseCHRStatement();
\r
454 return reduceConstraintStatement();
\r
456 return reduceDeclarations();
\r
458 return reduceVarId();
\r
460 return reduceEscapedSymbol();
\r
462 return reduceTupleConstructor();
\r
464 return reduceBinary();
\r
466 return reduceSimpleRhs();
\r
468 return reduceGuardedRhs();
\r
470 return reduceConstructor();
\r
472 return reduceRecordConstructor();
\r
474 return reduceContext();
\r
476 return reduceFundeps();
\r
478 return reduceTypeVar();
\r
480 return reduceTupleType();
\r
482 return reduceListType();
\r
484 return reduceListTypeConstructor();
\r
486 return reduceTupleTypeConstructor();
\r
488 return reduceLambda();
\r
490 return reduceLambdaMatch();
\r
492 return reduceLet();
\r
496 return reduceMatch();
\r
500 return reduceSelect();
\r
502 return reduceEnforce();
\r
504 return reduceVar();
\r
506 return reduceHashedId();
\r
508 return reduceBlank();
\r
510 return reduceInteger();
\r
512 return reduceFloat();
\r
514 return reduceString();
\r
516 return reduceChar();
\r
518 return reduceTuple();
\r
520 return reduceViewPattern();
\r
522 return reduceRightSection();
\r
524 return reduceLeftSection();
\r
526 return reduceListLiteral();
\r
528 return reduceRange();
\r
530 return reduceListComprehension();
\r
534 return reduceRecord();
\r
536 return reduceTransformation();
\r
540 return reduceRuleDeclarations();
\r
542 return reduceImportShowing();
\r
544 return reduceImportHiding();
\r
546 return reduceImportValueItem();
\r
548 return reduceFieldDescription();
\r
550 return reduceStatements();
\r
552 return reduceGuardedExpEq();
\r
554 return reduceFundep();
\r
556 return reduceQueryRuleDeclaration();
\r
558 return reduceAnnotation();
\r
560 return reduceGuardQuery();
\r
562 return reduceEqualsQuery();
\r
564 return reduceBindQuery();
\r
566 return reduceCompositeQuery();
\r
568 return reduceQueryBlock();
\r
570 return reduceApply();
\r
572 return reduceSymbol();
\r
574 return reduceEscapedId();
\r
576 return reduceMinus();
\r
578 return reduceLess();
\r
580 return reduceGreater();
\r
582 return reduceDot();
\r
584 return reduceFieldAccess();
\r
586 return reduceIdAccessor();
\r
588 return reduceStringAccessor();
\r
590 return reduceExpAccessor();
\r
592 return reduceCase();
\r
594 return reduceStringLiteral();
\r
596 return reduceSymbol();
\r
598 return reduceEscapedId();
\r
600 return reduceLess();
\r
602 return reduceGreater();
\r
604 return reduceDot();
\r
606 return reduceGuardQualifier();
\r
608 return reduceLetQualifier();
\r
610 return reduceBindQualifier();
\r
612 return reduceThenQualifier();
\r
614 return reduceField();
\r
616 return reduceFieldShorthand();
\r
618 return reduceCHRQuery();
\r
620 return reduceVerboseCHRQuery();
\r
622 return reduceSimpleCaseRhs();
\r
624 return reduceGuardedCaseRhs();
\r
626 return reduceGuardedExpArrow();
\r
628 return reduceGuardEquation();
\r
630 return reduceBasicEquation();
\r
632 return reduceEffect();
\r
634 return reduceJustEtype();
\r
636 return reduceForAll();
\r
638 return reduceApplyType();
\r
640 return reduceDummy1();
\r
643 throw new RuntimeException("Internal parser error.");
\r
645 } catch(SCLSyntaxErrorException e) {
\r
646 StringBuilder b = new StringBuilder();
\r
647 b.append("Failed to reduce");
\r
648 for(int i=0;i<length();++i) {
\r
649 Object obj = get(i);
\r
650 b.append("\n (").append(i).append(") \"").append(obj).append('\"');
\r
651 if(obj instanceof Token)
\r
652 b.append(" (").append(TERMINAL_NAMES[((Token)obj).id]).append(")");
\r
654 b.append(" [").append(obj.getClass().getSimpleName()).append("]");
\r
656 throw new RuntimeException(b.toString(), e);
\r
661 * module ::= (declaration (SEMICOLON declaration)*)?
\r
663 protected abstract Object reduceModule();
\r
665 * commands ::= command?
\r
667 protected abstract Object reduceOneCommand();
\r
669 * commands ::= commands SEMICOLON command
\r
671 protected abstract Object reduceManyCommands();
\r
673 * import ::= (IMPORT | INCLUDE) BEGIN_STRING END_STRING (AS ID)? importSpec?
\r
675 protected abstract Object reduceImport();
\r
677 * type ::= (etype (ARROW | IMPLIES))* etype
\r
679 protected abstract Object reduceArrow();
\r
681 * exp ::= bexp (HASTYPE type)?
\r
683 protected abstract Object reduceLocalTypeAnnotation();
\r
685 * exp ::= bexp COLON ID (queryBlock | WITH queryBlock?)?
\r
687 protected abstract Object reduceEntityTypeAnnotation();
\r
689 * equationBlock ::= (equation (SEMICOLON equation)*)?
\r
691 protected abstract Object reduceEquationBlock();
\r
693 * declaration ::= (var COMMA)* var HASTYPE type
\r
695 protected abstract Object reduceTypeAnnotation();
\r
697 * declaration ::= bexp rhs
\r
699 protected abstract Object reduceValueDefinition();
\r
701 * declaration ::= DATA ID ID* (EQUALS (constructor BAR)* constructor)?
\r
703 protected abstract Object reduceDataDefinition();
\r
705 * declaration ::= TYPE ID ID* EQUALS type
\r
707 protected abstract Object reduceTypeDefinition();
\r
709 * declaration ::= CLASS context? ID ID* (BAR fundeps | (BAR fundeps)? WHERE declarations)?
\r
711 protected abstract Object reduceClassDefinition();
\r
713 * declaration ::= INSTANCE context? ID atype atype* (WHERE declarations)?
\r
715 protected abstract Object reduceInstanceDefinition();
\r
717 * declaration ::= DERIVING INSTANCE context? ID atype atype*
\r
719 protected abstract Object reduceDerivingInstanceDefinition();
\r
721 * declaration ::= BEGIN_STRING END_STRING
\r
723 protected abstract Object reduceDocumentationString();
\r
725 * declaration ::= ANNOTATION_ID aexp*
\r
727 protected abstract Object reduceAnnotation();
\r
729 * declaration ::= (INFIX | INFIXL | INFIXR) INTEGER (var COMMA)* var
\r
731 protected abstract Object reducePrecedenceDefinition();
\r
733 * declaration ::= import
\r
735 protected abstract Object reduceJustImport();
\r
737 * declaration ::= IMPORTJAVA BEGIN_STRING END_STRING WHERE declarations
\r
739 protected abstract Object reduceImportJava();
\r
741 * declaration ::= EFFECT ID BEGIN_STRING END_STRING BEGIN_STRING END_STRING
\r
743 protected abstract Object reduceEffectDefinition();
\r
745 * declaration ::= (RULE | ABSTRACT_RULE) ID (EXTENDS (ID COMMA)* ID)? WHERE ruleDeclarations
\r
747 protected abstract Object reduceRuleDefinition();
\r
749 * declaration ::= MAPPING_RELATION ID atype*
\r
751 protected abstract Object reduceMappingRelationDefinition();
\r
753 * declaration ::= bexp FOLLOWS ruleDeclarations
\r
755 protected abstract Object reduceRelationDefinition();
\r
757 * command ::= statement
\r
759 protected abstract Object reduceStatementCommand();
\r
761 * command ::= import
\r
763 protected abstract Object reduceImportCommand();
\r
765 * statement ::= exp
\r
767 protected abstract Object reduceGuardStatement();
\r
769 * statement ::= exp rhs
\r
771 protected abstract Object reduceLetStatement();
\r
773 * statement ::= exp BINDS exp
\r
775 protected abstract Object reduceBindStatement();
\r
777 * statement ::= exp FOLLOWS queryBlock
\r
779 protected abstract Object reduceRuleStatement();
\r
781 * statement ::= chrQuery IMPLIES chrQuery
\r
783 protected abstract Object reduceCHRStatement();
\r
785 * statement ::= WHEN verboseChrQuery THEN_AFTER_WHEN verboseChrQuery
\r
787 protected abstract Object reduceVerboseCHRStatement();
\r
789 * statement ::= CONSTRAINT ID atype*
\r
791 protected abstract Object reduceConstraintStatement();
\r
793 * declarations ::= LBRACE (declaration (SEMICOLON (declaration SEMICOLON)* declaration)?)? RBRACE
\r
795 protected abstract Object reduceDeclarations();
\r
799 protected abstract Object reduceVarId();
\r
801 * var ::= ESCAPED_SYMBOL
\r
803 protected abstract Object reduceEscapedSymbol();
\r
805 * var ::= LPAREN COMMA COMMA* RPAREN
\r
807 protected abstract Object reduceTupleConstructor();
\r
809 * bexp ::= MINUS? lexp (symbol lexp)*
\r
811 protected abstract Object reduceBinary();
\r
813 * rhs ::= EQUALS exp (WHERE statements)?
\r
815 protected abstract Object reduceSimpleRhs();
\r
817 * rhs ::= guardedExpEq guardedExpEq* (WHERE statements)?
\r
819 protected abstract Object reduceGuardedRhs();
\r
821 * constructor ::= (ANNOTATION_ID aexp)* ID atype*
\r
823 protected abstract Object reduceConstructor();
\r
825 * constructor ::= (ANNOTATION_ID aexp)* ID LBRACE fieldDeclaration (COMMA fieldDeclaration)* RBRACE
\r
827 protected abstract Object reduceRecordConstructor();
\r
829 * context ::= LPAREN type (COMMA type)* RPAREN IMPLIES
\r
831 protected abstract Object reduceContext();
\r
833 * fundeps ::= (fundep COMMA)* fundep
\r
835 protected abstract Object reduceFundeps();
\r
839 protected abstract Object reduceTypeVar();
\r
841 * atype ::= LPAREN (type (COMMA (type COMMA)* type)?)? RPAREN
\r
843 protected abstract Object reduceTupleType();
\r
845 * atype ::= LBRACKET type RBRACKET
\r
847 protected abstract Object reduceListType();
\r
849 * atype ::= LBRACKET RBRACKET
\r
851 protected abstract Object reduceListTypeConstructor();
\r
853 * atype ::= LPAREN COMMA COMMA* RPAREN
\r
855 protected abstract Object reduceTupleTypeConstructor();
\r
857 * aexp ::= LAMBDA aexp aexp* ARROW exp
\r
859 protected abstract Object reduceLambda();
\r
861 * aexp ::= LAMBDA_MATCH LBRACE case (SEMICOLON case)* RBRACE
\r
863 protected abstract Object reduceLambdaMatch();
\r
865 * aexp ::= LET statements IN exp
\r
867 protected abstract Object reduceLet();
\r
869 * aexp ::= IF exp THEN exp (ELSE exp)?
\r
871 protected abstract Object reduceIf();
\r
873 * aexp ::= MATCH exp WITH LBRACE case (SEMICOLON case)* RBRACE
\r
875 protected abstract Object reduceMatch();
\r
877 * aexp ::= (DO | MDO) statements
\r
879 protected abstract Object reduceDo();
\r
881 * aexp ::= (SELECT | SELECT_FIRST | SELECT_DISTINCT) exp WHERE queryBlock
\r
883 protected abstract Object reduceSelect();
\r
885 * aexp ::= ENFORCE queryBlock
\r
887 protected abstract Object reduceEnforce();
\r
891 protected abstract Object reduceVar();
\r
893 * aexp ::= ATTACHED_HASH ID
\r
895 protected abstract Object reduceHashedId();
\r
899 protected abstract Object reduceBlank();
\r
903 protected abstract Object reduceInteger();
\r
907 protected abstract Object reduceFloat();
\r
909 * aexp ::= stringLiteral
\r
911 protected abstract Object reduceString();
\r
915 protected abstract Object reduceChar();
\r
917 * aexp ::= LPAREN (exp (COMMA (exp COMMA)* exp)?)? RPAREN
\r
919 protected abstract Object reduceTuple();
\r
921 * aexp ::= LPAREN exp ARROW exp RPAREN
\r
923 protected abstract Object reduceViewPattern();
\r
925 * aexp ::= LPAREN symbolWithoutMinus lexp RPAREN
\r
927 protected abstract Object reduceRightSection();
\r
929 * aexp ::= LPAREN lexp symbol RPAREN
\r
931 protected abstract Object reduceLeftSection();
\r
933 * aexp ::= LBRACKET (exp (COMMA (exp COMMA)* exp)?)? RBRACKET
\r
935 protected abstract Object reduceListLiteral();
\r
937 * aexp ::= LBRACKET exp DOTDOT exp RBRACKET
\r
939 protected abstract Object reduceRange();
\r
941 * aexp ::= LBRACKET exp BAR listQualifier (COMMA listQualifier)* RBRACKET
\r
943 protected abstract Object reduceListComprehension();
\r
945 * aexp ::= ID AT aexp
\r
947 protected abstract Object reduceAs();
\r
949 * aexp ::= ID LBRACE (field (COMMA field)*)? RBRACE
\r
951 protected abstract Object reduceRecord();
\r
953 * aexp ::= TRANSFORMATION ID WHERE queryBlock
\r
955 protected abstract Object reduceTransformation();
\r
957 * aexp ::= EQ LBRACE equationBlock RBRACE
\r
959 protected abstract Object reduceEq();
\r
961 * ruleDeclarations ::= LBRACE (ruleDeclaration (SEMICOLON (ruleDeclaration SEMICOLON)* ruleDeclaration)?)? RBRACE
\r
963 protected abstract Object reduceRuleDeclarations();
\r
965 * importSpec ::= LPAREN (importItem (COMMA (importItem COMMA)* importItem)?)? RPAREN
\r
967 protected abstract Object reduceImportShowing();
\r
969 * importSpec ::= HIDING LPAREN (importItem (COMMA importItem)*)? RPAREN
\r
971 protected abstract Object reduceImportHiding();
\r
973 * importItem ::= ID
\r
975 protected abstract Object reduceImportValueItem();
\r
977 * fieldDeclaration ::= ID HASTYPE type
\r
979 protected abstract Object reduceFieldDescription();
\r
981 * statements ::= LBRACE (statement (SEMICOLON (statement SEMICOLON)* statement)?)? RBRACE
\r
983 protected abstract Object reduceStatements();
\r
985 * guardedExpEq ::= BAR exp (COMMA exp)* EQUALS exp
\r
987 protected abstract Object reduceGuardedExpEq();
\r
989 * fundep ::= ID ID* ARROW ID
\r
991 protected abstract Object reduceFundep();
\r
993 * ruleDeclaration ::= query
\r
995 protected abstract Object reduceQueryRuleDeclaration();
\r
999 protected abstract Object reduceGuardQuery();
\r
1001 * query ::= exp EQUALS exp
\r
1003 protected abstract Object reduceEqualsQuery();
\r
1005 * query ::= exp BINDS exp
\r
1007 protected abstract Object reduceBindQuery();
\r
1009 * query ::= QUERY_OP queryBlock
\r
1011 protected abstract Object reduceCompositeQuery();
\r
1013 * queryBlock ::= LBRACE (query (SEMICOLON (query SEMICOLON)* query)?)? RBRACE
\r
1015 protected abstract Object reduceQueryBlock();
\r
1017 * lexp ::= faexp faexp*
\r
1019 protected abstract Object reduceApply();
\r
1021 * symbol ::= SYMBOL
\r
1023 protected abstract Object reduceSymbol();
\r
1025 * symbol ::= ESCAPED_ID
\r
1027 protected abstract Object reduceEscapedId();
\r
1029 * symbol ::= MINUS
\r
1031 protected abstract Object reduceMinus();
\r
1035 protected abstract Object reduceLess();
\r
1037 * symbol ::= GREATER
\r
1039 protected abstract Object reduceGreater();
\r
1041 * symbol ::= SEPARATED_DOT
\r
1043 protected abstract Object reduceDot();
\r
1045 * faexp ::= aexp ((ATTACHED_HASH | ATTACHED_DOT) accessor)*
\r
1047 protected abstract Object reduceFieldAccess();
\r
1051 protected abstract Object reduceIdAccessor();
\r
1053 * accessor ::= BEGIN_STRING END_STRING
\r
1055 protected abstract Object reduceStringAccessor();
\r
1057 * accessor ::= LPAREN exp RPAREN
\r
1059 protected abstract Object reduceExpAccessor();
\r
1061 * case ::= exp caseRhs
\r
1063 protected abstract Object reduceCase();
\r
1065 * stringLiteral ::= BEGIN_STRING (SUSPEND_STRING exp CONTINUE_STRING)* END_STRING
\r
1067 protected abstract Object reduceStringLiteral();
\r
1069 * listQualifier ::= exp
\r
1071 protected abstract Object reduceGuardQualifier();
\r
1073 * listQualifier ::= exp EQUALS exp
\r
1075 protected abstract Object reduceLetQualifier();
\r
1077 * listQualifier ::= exp BINDS exp
\r
1079 protected abstract Object reduceBindQualifier();
\r
1081 * listQualifier ::= THEN exp (BY exp)?
\r
1083 protected abstract Object reduceThenQualifier();
\r
1085 * field ::= ID EQUALS exp
\r
1087 protected abstract Object reduceField();
\r
1091 protected abstract Object reduceFieldShorthand();
\r
1093 * chrQuery ::= (listQualifier COMMA)* listQualifier
\r
1095 protected abstract Object reduceCHRQuery();
\r
1097 * verboseChrQuery ::= LBRACE listQualifier (SEMICOLON listQualifier)* RBRACE
\r
1099 protected abstract Object reduceVerboseCHRQuery();
\r
1101 * caseRhs ::= ARROW exp (WHERE statements)?
\r
1103 protected abstract Object reduceSimpleCaseRhs();
\r
1105 * caseRhs ::= guardedExpArrow guardedExpArrow* (WHERE statements)?
\r
1107 protected abstract Object reduceGuardedCaseRhs();
\r
1109 * guardedExpArrow ::= BAR exp (COMMA exp)* ARROW exp
\r
1111 protected abstract Object reduceGuardedExpArrow();
\r
1113 * equation ::= exp
\r
1115 protected abstract Object reduceGuardEquation();
\r
1117 * equation ::= exp EQUALS exp
\r
1119 protected abstract Object reduceBasicEquation();
\r
1121 * etype ::= LESS ID (COMMA ID)* GREATER btype
\r
1123 protected abstract Object reduceEffect();
\r
1127 protected abstract Object reduceJustEtype();
\r
1129 * etype ::= FORALL ID ID* (SEPARATED_DOT | ATTACHED_DOT) type
\r
1131 protected abstract Object reduceForAll();
\r
1133 * btype ::= atype atype*
\r
1135 protected abstract Object reduceApplyType();
\r
1137 * dummy ::= COMMENT EOL
\r
1139 protected abstract Object reduceDummy1();
\r
1141 protected void postReduce(Object reduced) {
\r