-package org.simantics.scl.compiler.internal.parsing.parser;\r
-\r
-import java.io.DataInputStream;\r
-import java.io.IOException;\r
-import java.util.ArrayList;\r
-import java.util.Arrays;\r
-import java.util.Collections;\r
-import org.simantics.scl.compiler.internal.parsing.exceptions.SCLSyntaxErrorException;\r
-\r
-import org.simantics.scl.compiler.internal.parsing.Token;\r
-\r
-public abstract class SCLParser { \r
- public static final boolean TRACE = false;\r
-\r
- private static final int INITIAL_CAPACITY = 16;\r
- private static final int STATE_COUNT = 344;\r
- private static final int TERMINAL_COUNT = 82;\r
- private static final int NONTERMINAL_COUNT = 51;\r
- private static final int PRODUCT_COUNT = 132;\r
- \r
- private static final int[] ACTION_ROW_ID = new int[STATE_COUNT];\r
- private static final int[] ACTION_COLUMN_ID = new int[TERMINAL_COUNT];\r
- private static final short[] ACTION_TABLE = new short[6120];\r
- private static final int[] ERROR_TABLE = new int[882];\r
- private static final int[] GOTO_ROW_ID = new int[STATE_COUNT];\r
- private static final int[] GOTO_COLUMN_ID = new int[NONTERMINAL_COUNT];\r
- private static final short[] GOTO_TABLE = new short[1829];\r
- private static final int[] PRODUCT_LHS = new int[PRODUCT_COUNT];\r
-\r
- private static final short STATE_MASK = (short)0x0fff;\r
- private static final short REDUCE_MASK = (short)0x8000;\r
- private static final short POP_MASK = (short)0x4000;\r
- private static final short PUSH_MASK = (short)0x2000;\r
- private static final short ERROR_ACTION = (short)0xffff;\r
- private static final short ACCEPT_ACTION = (short)0xfffe;\r
- \r
- public static final String[] TERMINAL_NAMES = new String[] {\r
- "SEMICOLON",\r
- "LBRACE",\r
- "RBRACE",\r
- "COMMA",\r
- "HASTYPE",\r
- "DATA",\r
- "ID",\r
- "EQUALS",\r
- "BAR",\r
- "TYPE",\r
- "CLASS",\r
- "WHERE",\r
- "INSTANCE",\r
- "DERIVING",\r
- "BEGIN_STRING",\r
- "END_STRING",\r
- "ANNOTATION_ID",\r
- "INFIX",\r
- "INFIXL",\r
- "INFIXR",\r
- "INTEGER",\r
- "IMPORTJAVA",\r
- "EFFECT",\r
- "RULE",\r
- "ABSTRACT_RULE",\r
- "EXTENDS",\r
- "MAPPING_RELATION",\r
- "FOLLOWS",\r
- "IMPORT",\r
- "INCLUDE",\r
- "AS",\r
- "LPAREN",\r
- "RPAREN",\r
- "HIDING",\r
- "ARROW",\r
- "COLON",\r
- "WITH",\r
- "MINUS",\r
- "SYMBOL",\r
- "LESS",\r
- "GREATER",\r
- "SEPARATED_DOT",\r
- "ESCAPED_ID",\r
- "LAMBDA",\r
- "LAMBDA_MATCH",\r
- "LET",\r
- "IF",\r
- "MATCH",\r
- "DO",\r
- "MDO",\r
- "ENFORCE",\r
- "BLANK",\r
- "FLOAT",\r
- "LBRACKET",\r
- "ESCAPED_SYMBOL",\r
- "CHAR",\r
- "WHEN",\r
- "ATTACHED_HASH",\r
- "SELECT",\r
- "SELECT_FIRST",\r
- "SELECT_DISTINCT",\r
- "TRANSFORMATION",\r
- "EQ",\r
- "ATTACHED_DOT",\r
- "IN",\r
- "THEN",\r
- "ELSE",\r
- "RBRACKET",\r
- "DOTDOT",\r
- "AT",\r
- "SUSPEND_STRING",\r
- "CONTINUE_STRING",\r
- "BINDS",\r
- "IMPLIES",\r
- "THEN_AFTER_WHEN",\r
- "CONSTRAINT",\r
- "BY",\r
- "QUERY_OP",\r
- "FORALL",\r
- "COMMENT",\r
- "EOL",\r
- "EOF"\r
- };\r
-\r
- public static final String[] NONTERMINAL_NAMES = new String[] {\r
- "module",\r
- "commands",\r
- "import",\r
- "type",\r
- "exp",\r
- "equationBlock",\r
- "declaration",\r
- "command",\r
- "statement",\r
- "declarations",\r
- "var",\r
- "bexp",\r
- "rhs",\r
- "constructor",\r
- "context",\r
- "fundeps",\r
- "atype",\r
- "aexp",\r
- "ruleDeclarations",\r
- "importSpec",\r
- "importItem",\r
- "fieldDeclaration",\r
- "statements",\r
- "guardedExpEq",\r
- "fundep",\r
- "ruleDeclaration",\r
- "query",\r
- "queryBlock",\r
- "lexp",\r
- "symbol",\r
- "faexp",\r
- "accessor",\r
- "case",\r
- "stringLiteral",\r
- "symbolWithoutMinus",\r
- "listQualifier",\r
- "field",\r
- "chrQuery",\r
- "verboseChrQuery",\r
- "caseRhs",\r
- "guardedExpArrow",\r
- "equation",\r
- "etype",\r
- "btype",\r
- "dummy",\r
- "init$6",\r
- "init$5",\r
- "init$4",\r
- "init$3",\r
- "init$2",\r
- "init$1"\r
- };\r
- \r
- static {\r
- try {\r
- DataInputStream input = new DataInputStream(SCLParser.class.getResourceAsStream("SCLParser.dat"));\r
- for(int i=0;i<ACTION_ROW_ID.length;++i)\r
- ACTION_ROW_ID[i] = input.readInt();\r
- for(int i=0;i<ACTION_COLUMN_ID.length;++i)\r
- ACTION_COLUMN_ID[i] = input.readInt(); \r
- for(int i=0;i<ACTION_TABLE.length;++i)\r
- ACTION_TABLE[i] = input.readShort();\r
- for(int i=0;i<ERROR_TABLE.length;++i)\r
- ERROR_TABLE[i] = input.readInt();\r
- for(int i=0;i<GOTO_ROW_ID.length;++i)\r
- GOTO_ROW_ID[i] = input.readInt();\r
- for(int i=0;i<GOTO_COLUMN_ID.length;++i)\r
- GOTO_COLUMN_ID[i] = input.readInt(); \r
- for(int i=0;i<GOTO_TABLE.length;++i)\r
- GOTO_TABLE[i] = input.readShort();\r
- for(int i=0;i<PRODUCT_LHS.length;++i)\r
- PRODUCT_LHS[i] = input.readInt();\r
- input.close();\r
- } catch(IOException e) {\r
- e.printStackTrace();\r
- }\r
- }\r
- \r
- private static short getAction(int state, int symbol) {\r
- int id = TERMINAL_COUNT*state + symbol;\r
- if( ((ERROR_TABLE[id>>5] >> (id&31))&1) != 0 )\r
- return ERROR_ACTION;\r
- return ACTION_TABLE[ACTION_ROW_ID[state] + ACTION_COLUMN_ID[symbol]];\r
- }\r
- \r
- private static short getGoto(int state, int symbol) {\r
- return GOTO_TABLE[GOTO_ROW_ID[state] + GOTO_COLUMN_ID[symbol]];\r
- }\r
- \r
- protected abstract Token nextToken();\r
- \r
- private Object[] symbolStack = new Object[INITIAL_CAPACITY];\r
- private int symbolStackLength = 0;\r
- \r
- private int[] stateStack = new int[INITIAL_CAPACITY];\r
- private int[] symbolStackPositionStack = new int[INITIAL_CAPACITY];\r
- private int stateStackLength = 0;\r
- \r
- // For reduce\r
- private int reductionLength;\r
- \r
- protected int length() {\r
- return reductionLength;\r
- }\r
- \r
- protected Object get(int i) {\r
- if(i < 0 || i >= reductionLength)\r
- throw new IndexOutOfBoundsException();\r
- return symbolStack[symbolStackLength+i];\r
- }\r
- \r
- private String parseErrorDescription(int state, Token token, int tokenId) {\r
- StringBuilder b = new StringBuilder();\r
- b.append("Unexpected token '").append(token)\r
- .append("' (").append(TERMINAL_NAMES[tokenId])\r
- .append("). Expected one of ");\r
- ArrayList<String> possibleTerminals = new ArrayList<String>();\r
- for(int i=0;i<TERMINAL_COUNT;++i)\r
- if(getAction(state, i) != ERROR_ACTION)\r
- possibleTerminals.add(TERMINAL_NAMES[i]);\r
- Collections.sort(possibleTerminals);\r
- for(int i=0;i<possibleTerminals.size();++i) {\r
- if(i > 0)\r
- b.append(", ");\r
- b.append(possibleTerminals.get(i));\r
- }\r
- b.append('.');\r
- return b.toString();\r
- }\r
- \r
- protected abstract RuntimeException syntaxError(Token token, String description);\r
- \r
- private static String describeAction(int action) {\r
- if(action == ERROR_ACTION)\r
- return "ERROR";\r
- if(action == ACCEPT_ACTION)\r
- return "ACCEPT";\r
- StringBuilder b = new StringBuilder();\r
- if((action & REDUCE_MASK) != 0) {\r
- action ^= REDUCE_MASK;\r
- b.append("REDUCE");\r
- }\r
- else\r
- b.append("SHIFT");\r
- if((action & POP_MASK) != 0) {\r
- action ^= POP_MASK;\r
- b.append(" POP");\r
- }\r
- if((action & PUSH_MASK) != 0) {\r
- action ^= PUSH_MASK;\r
- b.append(" PUSH");\r
- }\r
- b.append(' ').append(action);\r
- return b.toString();\r
- }\r
- \r
- private Object parse(int state) {\r
- while(true) {\r
- Token token = nextToken();\r
- int tokenId = token.id;\r
- while(true) {\r
- short action = getAction(state, tokenId);\r
- if(TRACE) {\r
- System.out.println("state=" + state + ", tokenId=" + TERMINAL_NAMES[tokenId] + \r
- ", action=" + describeAction(action));\r
- System.out.print(" ");\r
- for(int i=symbolStackLength-1,j=stateStackLength-1;i>=0;--i) { \r
- Object s = symbolStack[i];\r
- if(s instanceof Token)\r
- System.out.print(" " + TERMINAL_NAMES[((Token)s).id]);\r
- else\r
- System.out.print(" " + s.getClass().getSimpleName()); \r
- while(j>=0 && symbolStackPositionStack[j]==i)\r
- System.out.print(" (" + stateStack[j--] + ")");\r
- }\r
- System.out.println();\r
- }\r
- //System.out.println(STATE_DESCRIPTIONS[state]);\r
- if((action & REDUCE_MASK) != 0) {\r
- if(action == ACCEPT_ACTION)\r
- return symbolStack[symbolStackLength-1];\r
- if(action == ERROR_ACTION)\r
- throw syntaxError(token, parseErrorDescription(state, token, tokenId));\r
- stateStackLength -= (action >>> 13)&3;\r
- action &= STATE_MASK;\r
- \r
- int reductionBegin = symbolStackPositionStack[--stateStackLength];\r
- \r
- reductionLength = symbolStackLength-reductionBegin;\r
- symbolStackLength = reductionBegin;\r
- \r
- if(symbolStackLength == symbolStack.length)\r
- symbolStack = Arrays.copyOf(symbolStack, symbolStackLength*2);\r
- Object symbol = reduce(action);\r
- postReduce(symbol);\r
- symbolStack[symbolStackLength] = symbol;\r
- \r
- state = stateStack[stateStackLength];\r
- action = getGoto(state, PRODUCT_LHS[action]);\r
- // Pop state\r
- if((action & POP_MASK) != 0) {\r
- --stateStackLength;\r
- }\r
- // Push state\r
- if((action & PUSH_MASK) != 0) {\r
- if(stateStackLength == stateStack.length) {\r
- stateStack = Arrays.copyOf(stateStack, stateStackLength*2);\r
- symbolStackPositionStack = Arrays.copyOf(symbolStackPositionStack, stateStackLength*2);\r
- }\r
- symbolStackPositionStack[stateStackLength] = symbolStackLength;\r
- stateStack[stateStackLength++] = state;\r
- }\r
- state = action & STATE_MASK;\r
- ++symbolStackLength;\r
- }\r
- else {\r
- // Pop state\r
- if((action & POP_MASK) != 0) {\r
- --stateStackLength;\r
- }\r
- // Push state\r
- if((action & PUSH_MASK) != 0) {\r
- if(stateStackLength == stateStack.length) {\r
- stateStack = Arrays.copyOf(stateStack, stateStackLength*2);\r
- symbolStackPositionStack = Arrays.copyOf(symbolStackPositionStack, stateStackLength*2);\r
- }\r
- symbolStackPositionStack[stateStackLength] = symbolStackLength;\r
- stateStack[stateStackLength++] = state;\r
- }\r
- \r
- // New state\r
- state = action & STATE_MASK;\r
- \r
- // Push symbol\r
- if(symbolStackLength == symbolStack.length)\r
- symbolStack = Arrays.copyOf(symbolStack, symbolStackLength*2);\r
- symbolStack[symbolStackLength++] = token;\r
- break;\r
- }\r
- }\r
- }\r
- }\r
- \r
- public Object parseModule() {\r
- return parse(0);\r
- }\r
- public Object parseCommands() {\r
- return parse(329);\r
- }\r
- public Object parseImport() {\r
- return parse(336);\r
- }\r
- public Object parseType() {\r
- return parse(338);\r
- }\r
- public Object parseExp() {\r
- return parse(340);\r
- }\r
- public Object parseEquationBlock() {\r
- return parse(342);\r
- }\r
-\r
-\r
- protected Object reduce(int productionId) {\r
- try {\r
- switch(productionId) {\r
- case 0:\r
- return reduceModule();\r
- case 1:\r
- return reduceOneCommand();\r
- case 2:\r
- return reduceManyCommands();\r
- case 3:\r
- return reduceImport();\r
- case 4:\r
- return reduceArrow();\r
- case 5:\r
- return reduceLocalTypeAnnotation();\r
- case 6:\r
- return reduceEntityTypeAnnotation();\r
- case 7:\r
- return reduceEquationBlock();\r
- case 8:\r
- return reduceTypeAnnotation();\r
- case 9:\r
- return reduceValueDefinition();\r
- case 10:\r
- return reduceDataDefinition();\r
- case 11:\r
- return reduceTypeDefinition();\r
- case 12:\r
- return reduceClassDefinition();\r
- case 13:\r
- return reduceInstanceDefinition();\r
- case 14:\r
- return reduceDerivingInstanceDefinition();\r
- case 15:\r
- return reduceDocumentationString();\r
- case 16:\r
- return reduceAnnotation();\r
- case 17:\r
- return reducePrecedenceDefinition();\r
- case 18:\r
- return reduceJustImport();\r
- case 19:\r
- return reduceImportJava();\r
- case 20:\r
- return reduceEffectDefinition();\r
- case 21:\r
- return reduceRuleDefinition();\r
- case 22:\r
- return reduceMappingRelationDefinition();\r
- case 23:\r
- return reduceRelationDefinition();\r
- case 24:\r
- return reduceStatementCommand();\r
- case 25:\r
- return reduceImportCommand();\r
- case 26:\r
- return reduceGuardStatement();\r
- case 27:\r
- return reduceLetStatement();\r
- case 28:\r
- return reduceBindStatement();\r
- case 29:\r
- return reduceRuleStatement();\r
- case 30:\r
- return reduceCHRStatement();\r
- case 31:\r
- return reduceVerboseCHRStatement();\r
- case 32:\r
- return reduceConstraintStatement();\r
- case 33:\r
- return reduceDeclarations();\r
- case 34:\r
- return reduceVarId();\r
- case 35:\r
- return reduceEscapedSymbol();\r
- case 36:\r
- return reduceTupleConstructor();\r
- case 37:\r
- return reduceBinary();\r
- case 38:\r
- return reduceSimpleRhs();\r
- case 39:\r
- return reduceGuardedRhs();\r
- case 40:\r
- return reduceConstructor();\r
- case 41:\r
- return reduceRecordConstructor();\r
- case 42:\r
- return reduceContext();\r
- case 43:\r
- return reduceFundeps();\r
- case 44:\r
- return reduceTypeVar();\r
- case 45:\r
- return reduceTupleType();\r
- case 46:\r
- return reduceListType();\r
- case 47:\r
- return reduceListTypeConstructor();\r
- case 48:\r
- return reduceTupleTypeConstructor();\r
- case 49:\r
- return reduceLambda();\r
- case 50:\r
- return reduceLambdaMatch();\r
- case 51:\r
- return reduceLet();\r
- case 52:\r
- return reduceIf();\r
- case 53:\r
- return reduceMatch();\r
- case 54:\r
- return reduceDo();\r
- case 55:\r
- return reduceSelect();\r
- case 56:\r
- return reduceEnforce();\r
- case 57:\r
- return reduceVar();\r
- case 58:\r
- return reduceHashedId();\r
- case 59:\r
- return reduceBlank();\r
- case 60:\r
- return reduceInteger();\r
- case 61:\r
- return reduceFloat();\r
- case 62:\r
- return reduceString();\r
- case 63:\r
- return reduceChar();\r
- case 64:\r
- return reduceTuple();\r
- case 65:\r
- return reduceViewPattern();\r
- case 66:\r
- return reduceRightSection();\r
- case 67:\r
- return reduceLeftSection();\r
- case 68:\r
- return reduceListLiteral();\r
- case 69:\r
- return reduceRange();\r
- case 70:\r
- return reduceListComprehension();\r
- case 71:\r
- return reduceAs();\r
- case 72:\r
- return reduceRecord();\r
- case 73:\r
- return reduceTransformation();\r
- case 74:\r
- return reduceEq();\r
- case 75:\r
- return reduceRuleDeclarations();\r
- case 76:\r
- return reduceImportShowing();\r
- case 77:\r
- return reduceImportHiding();\r
- case 78:\r
- return reduceImportValueItem();\r
- case 79:\r
- return reduceFieldDescription();\r
- case 80:\r
- return reduceStatements();\r
- case 81:\r
- return reduceGuardedExpEq();\r
- case 82:\r
- return reduceFundep();\r
- case 83:\r
- return reduceQueryRuleDeclaration();\r
- case 84:\r
- return reduceAnnotation();\r
- case 85:\r
- return reduceGuardQuery();\r
- case 86:\r
- return reduceEqualsQuery();\r
- case 87:\r
- return reduceBindQuery();\r
- case 88:\r
- return reduceCompositeQuery();\r
- case 89:\r
- return reduceQueryBlock();\r
- case 90:\r
- return reduceApply();\r
- case 91:\r
- return reduceSymbol();\r
- case 92:\r
- return reduceEscapedId();\r
- case 93:\r
- return reduceMinus();\r
- case 94:\r
- return reduceLess();\r
- case 95:\r
- return reduceGreater();\r
- case 96:\r
- return reduceDot();\r
- case 97:\r
- return reduceFieldAccess();\r
- case 98:\r
- return reduceIdAccessor();\r
- case 99:\r
- return reduceStringAccessor();\r
- case 100:\r
- return reduceExpAccessor();\r
- case 101:\r
- return reduceCase();\r
- case 102:\r
- return reduceStringLiteral();\r
- case 103:\r
- return reduceSymbol();\r
- case 104:\r
- return reduceEscapedId();\r
- case 105:\r
- return reduceLess();\r
- case 106:\r
- return reduceGreater();\r
- case 107:\r
- return reduceDot();\r
- case 108:\r
- return reduceGuardQualifier();\r
- case 109:\r
- return reduceLetQualifier();\r
- case 110:\r
- return reduceBindQualifier();\r
- case 111:\r
- return reduceThenQualifier();\r
- case 112:\r
- return reduceField();\r
- case 113:\r
- return reduceFieldShorthand();\r
- case 114:\r
- return reduceCHRQuery();\r
- case 115:\r
- return reduceVerboseCHRQuery();\r
- case 116:\r
- return reduceSimpleCaseRhs();\r
- case 117:\r
- return reduceGuardedCaseRhs();\r
- case 118:\r
- return reduceGuardedExpArrow();\r
- case 119:\r
- return reduceGuardEquation();\r
- case 120:\r
- return reduceBasicEquation();\r
- case 121:\r
- return reduceEffect();\r
- case 122:\r
- return reduceJustEtype();\r
- case 123:\r
- return reduceForAll();\r
- case 124:\r
- return reduceApplyType();\r
- case 125:\r
- return reduceDummy1();\r
-\r
- default:\r
- throw new RuntimeException("Internal parser error.");\r
- }\r
- } catch(SCLSyntaxErrorException e) {\r
- StringBuilder b = new StringBuilder();\r
- b.append("Failed to reduce");\r
- for(int i=0;i<length();++i) {\r
- Object obj = get(i);\r
- b.append("\n (").append(i).append(") \"").append(obj).append('\"');\r
- if(obj instanceof Token)\r
- b.append(" (").append(TERMINAL_NAMES[((Token)obj).id]).append(")");\r
- else\r
- b.append(" [").append(obj.getClass().getSimpleName()).append("]");\r
- }\r
- throw new RuntimeException(b.toString(), e);\r
- } \r
- }\r
-\r
- /**\r
- * module ::= (declaration (SEMICOLON declaration)*)?\r
- */\r
- protected abstract Object reduceModule();\r
- /**\r
- * commands ::= command?\r
- */\r
- protected abstract Object reduceOneCommand();\r
- /**\r
- * commands ::= commands SEMICOLON command\r
- */\r
- protected abstract Object reduceManyCommands();\r
- /**\r
- * import ::= (IMPORT | INCLUDE) BEGIN_STRING END_STRING (AS ID)? importSpec?\r
- */\r
- protected abstract Object reduceImport();\r
- /**\r
- * type ::= (etype (ARROW | IMPLIES))* etype\r
- */\r
- protected abstract Object reduceArrow();\r
- /**\r
- * exp ::= bexp (HASTYPE type)?\r
- */\r
- protected abstract Object reduceLocalTypeAnnotation();\r
- /**\r
- * exp ::= bexp COLON ID (queryBlock | WITH queryBlock?)?\r
- */\r
- protected abstract Object reduceEntityTypeAnnotation();\r
- /**\r
- * equationBlock ::= (equation (SEMICOLON equation)*)?\r
- */\r
- protected abstract Object reduceEquationBlock();\r
- /**\r
- * declaration ::= (var COMMA)* var HASTYPE type\r
- */\r
- protected abstract Object reduceTypeAnnotation();\r
- /**\r
- * declaration ::= bexp rhs\r
- */\r
- protected abstract Object reduceValueDefinition();\r
- /**\r
- * declaration ::= DATA ID ID* (EQUALS (constructor BAR)* constructor)?\r
- */\r
- protected abstract Object reduceDataDefinition();\r
- /**\r
- * declaration ::= TYPE ID ID* EQUALS type\r
- */\r
- protected abstract Object reduceTypeDefinition();\r
- /**\r
- * declaration ::= CLASS context? ID ID* (BAR fundeps | (BAR fundeps)? WHERE declarations)?\r
- */\r
- protected abstract Object reduceClassDefinition();\r
- /**\r
- * declaration ::= INSTANCE context? ID atype atype* (WHERE declarations)?\r
- */\r
- protected abstract Object reduceInstanceDefinition();\r
- /**\r
- * declaration ::= DERIVING INSTANCE context? ID atype atype*\r
- */\r
- protected abstract Object reduceDerivingInstanceDefinition();\r
- /**\r
- * declaration ::= BEGIN_STRING END_STRING\r
- */\r
- protected abstract Object reduceDocumentationString();\r
- /**\r
- * declaration ::= ANNOTATION_ID aexp*\r
- */\r
- protected abstract Object reduceAnnotation();\r
- /**\r
- * declaration ::= (INFIX | INFIXL | INFIXR) INTEGER (var COMMA)* var\r
- */\r
- protected abstract Object reducePrecedenceDefinition();\r
- /**\r
- * declaration ::= import\r
- */\r
- protected abstract Object reduceJustImport();\r
- /**\r
- * declaration ::= IMPORTJAVA BEGIN_STRING END_STRING WHERE declarations\r
- */\r
- protected abstract Object reduceImportJava();\r
- /**\r
- * declaration ::= EFFECT ID BEGIN_STRING END_STRING BEGIN_STRING END_STRING\r
- */\r
- protected abstract Object reduceEffectDefinition();\r
- /**\r
- * declaration ::= (RULE | ABSTRACT_RULE) ID (EXTENDS (ID COMMA)* ID)? WHERE ruleDeclarations\r
- */\r
- protected abstract Object reduceRuleDefinition();\r
- /**\r
- * declaration ::= MAPPING_RELATION ID atype*\r
- */\r
- protected abstract Object reduceMappingRelationDefinition();\r
- /**\r
- * declaration ::= bexp FOLLOWS ruleDeclarations\r
- */\r
- protected abstract Object reduceRelationDefinition();\r
- /**\r
- * command ::= statement\r
- */\r
- protected abstract Object reduceStatementCommand();\r
- /**\r
- * command ::= import\r
- */\r
- protected abstract Object reduceImportCommand();\r
- /**\r
- * statement ::= exp\r
- */\r
- protected abstract Object reduceGuardStatement();\r
- /**\r
- * statement ::= exp rhs\r
- */\r
- protected abstract Object reduceLetStatement();\r
- /**\r
- * statement ::= exp BINDS exp\r
- */\r
- protected abstract Object reduceBindStatement();\r
- /**\r
- * statement ::= exp FOLLOWS queryBlock\r
- */\r
- protected abstract Object reduceRuleStatement();\r
- /**\r
- * statement ::= chrQuery IMPLIES chrQuery\r
- */\r
- protected abstract Object reduceCHRStatement();\r
- /**\r
- * statement ::= WHEN verboseChrQuery THEN_AFTER_WHEN verboseChrQuery\r
- */\r
- protected abstract Object reduceVerboseCHRStatement();\r
- /**\r
- * statement ::= CONSTRAINT ID atype*\r
- */\r
- protected abstract Object reduceConstraintStatement();\r
- /**\r
- * declarations ::= LBRACE (declaration (SEMICOLON (declaration SEMICOLON)* declaration)?)? RBRACE\r
- */\r
- protected abstract Object reduceDeclarations();\r
- /**\r
- * var ::= ID\r
- */\r
- protected abstract Object reduceVarId();\r
- /**\r
- * var ::= ESCAPED_SYMBOL\r
- */\r
- protected abstract Object reduceEscapedSymbol();\r
- /**\r
- * var ::= LPAREN COMMA COMMA* RPAREN\r
- */\r
- protected abstract Object reduceTupleConstructor();\r
- /**\r
- * bexp ::= MINUS? lexp (symbol lexp)*\r
- */\r
- protected abstract Object reduceBinary();\r
- /**\r
- * rhs ::= EQUALS exp (WHERE statements)?\r
- */\r
- protected abstract Object reduceSimpleRhs();\r
- /**\r
- * rhs ::= guardedExpEq guardedExpEq* (WHERE statements)?\r
- */\r
- protected abstract Object reduceGuardedRhs();\r
- /**\r
- * constructor ::= (ANNOTATION_ID aexp)* ID atype*\r
- */\r
- protected abstract Object reduceConstructor();\r
- /**\r
- * constructor ::= (ANNOTATION_ID aexp)* ID LBRACE fieldDeclaration (COMMA fieldDeclaration)* RBRACE\r
- */\r
- protected abstract Object reduceRecordConstructor();\r
- /**\r
- * context ::= LPAREN type (COMMA type)* RPAREN IMPLIES\r
- */\r
- protected abstract Object reduceContext();\r
- /**\r
- * fundeps ::= (fundep COMMA)* fundep\r
- */\r
- protected abstract Object reduceFundeps();\r
- /**\r
- * atype ::= ID\r
- */\r
- protected abstract Object reduceTypeVar();\r
- /**\r
- * atype ::= LPAREN (type (COMMA (type COMMA)* type)?)? RPAREN\r
- */\r
- protected abstract Object reduceTupleType();\r
- /**\r
- * atype ::= LBRACKET type RBRACKET\r
- */\r
- protected abstract Object reduceListType();\r
- /**\r
- * atype ::= LBRACKET RBRACKET\r
- */\r
- protected abstract Object reduceListTypeConstructor();\r
- /**\r
- * atype ::= LPAREN COMMA COMMA* RPAREN\r
- */\r
- protected abstract Object reduceTupleTypeConstructor();\r
- /**\r
- * aexp ::= LAMBDA aexp aexp* ARROW exp\r
- */\r
- protected abstract Object reduceLambda();\r
- /**\r
- * aexp ::= LAMBDA_MATCH LBRACE case (SEMICOLON case)* RBRACE\r
- */\r
- protected abstract Object reduceLambdaMatch();\r
- /**\r
- * aexp ::= LET statements IN exp\r
- */\r
- protected abstract Object reduceLet();\r
- /**\r
- * aexp ::= IF exp THEN exp (ELSE exp)?\r
- */\r
- protected abstract Object reduceIf();\r
- /**\r
- * aexp ::= MATCH exp WITH LBRACE case (SEMICOLON case)* RBRACE\r
- */\r
- protected abstract Object reduceMatch();\r
- /**\r
- * aexp ::= (DO | MDO) statements\r
- */\r
- protected abstract Object reduceDo();\r
- /**\r
- * aexp ::= (SELECT | SELECT_FIRST | SELECT_DISTINCT) exp WHERE queryBlock\r
- */\r
- protected abstract Object reduceSelect();\r
- /**\r
- * aexp ::= ENFORCE queryBlock\r
- */\r
- protected abstract Object reduceEnforce();\r
- /**\r
- * aexp ::= var\r
- */\r
- protected abstract Object reduceVar();\r
- /**\r
- * aexp ::= ATTACHED_HASH ID\r
- */\r
- protected abstract Object reduceHashedId();\r
- /**\r
- * aexp ::= BLANK\r
- */\r
- protected abstract Object reduceBlank();\r
- /**\r
- * aexp ::= INTEGER\r
- */\r
- protected abstract Object reduceInteger();\r
- /**\r
- * aexp ::= FLOAT\r
- */\r
- protected abstract Object reduceFloat();\r
- /**\r
- * aexp ::= stringLiteral\r
- */\r
- protected abstract Object reduceString();\r
- /**\r
- * aexp ::= CHAR\r
- */\r
- protected abstract Object reduceChar();\r
- /**\r
- * aexp ::= LPAREN (exp (COMMA (exp COMMA)* exp)?)? RPAREN\r
- */\r
- protected abstract Object reduceTuple();\r
- /**\r
- * aexp ::= LPAREN exp ARROW exp RPAREN\r
- */\r
- protected abstract Object reduceViewPattern();\r
- /**\r
- * aexp ::= LPAREN symbolWithoutMinus lexp RPAREN\r
- */\r
- protected abstract Object reduceRightSection();\r
- /**\r
- * aexp ::= LPAREN lexp symbol RPAREN\r
- */\r
- protected abstract Object reduceLeftSection();\r
- /**\r
- * aexp ::= LBRACKET (exp (COMMA (exp COMMA)* exp)?)? RBRACKET\r
- */\r
- protected abstract Object reduceListLiteral();\r
- /**\r
- * aexp ::= LBRACKET exp DOTDOT exp RBRACKET\r
- */\r
- protected abstract Object reduceRange();\r
- /**\r
- * aexp ::= LBRACKET exp BAR listQualifier (COMMA listQualifier)* RBRACKET\r
- */\r
- protected abstract Object reduceListComprehension();\r
- /**\r
- * aexp ::= ID AT aexp\r
- */\r
- protected abstract Object reduceAs();\r
- /**\r
- * aexp ::= ID LBRACE (field (COMMA field)*)? RBRACE\r
- */\r
- protected abstract Object reduceRecord();\r
- /**\r
- * aexp ::= TRANSFORMATION ID WHERE queryBlock\r
- */\r
- protected abstract Object reduceTransformation();\r
- /**\r
- * aexp ::= EQ LBRACE equationBlock RBRACE\r
- */\r
- protected abstract Object reduceEq();\r
- /**\r
- * ruleDeclarations ::= LBRACE (ruleDeclaration (SEMICOLON (ruleDeclaration SEMICOLON)* ruleDeclaration)?)? RBRACE\r
- */\r
- protected abstract Object reduceRuleDeclarations();\r
- /**\r
- * importSpec ::= LPAREN (importItem (COMMA (importItem COMMA)* importItem)?)? RPAREN\r
- */\r
- protected abstract Object reduceImportShowing();\r
- /**\r
- * importSpec ::= HIDING LPAREN (importItem (COMMA importItem)*)? RPAREN\r
- */\r
- protected abstract Object reduceImportHiding();\r
- /**\r
- * importItem ::= ID\r
- */\r
- protected abstract Object reduceImportValueItem();\r
- /**\r
- * fieldDeclaration ::= ID HASTYPE type\r
- */\r
- protected abstract Object reduceFieldDescription();\r
- /**\r
- * statements ::= LBRACE (statement (SEMICOLON (statement SEMICOLON)* statement)?)? RBRACE\r
- */\r
- protected abstract Object reduceStatements();\r
- /**\r
- * guardedExpEq ::= BAR exp (COMMA exp)* EQUALS exp\r
- */\r
- protected abstract Object reduceGuardedExpEq();\r
- /**\r
- * fundep ::= ID ID* ARROW ID\r
- */\r
- protected abstract Object reduceFundep();\r
- /**\r
- * ruleDeclaration ::= query\r
- */\r
- protected abstract Object reduceQueryRuleDeclaration();\r
- /**\r
- * query ::= exp\r
- */\r
- protected abstract Object reduceGuardQuery();\r
- /**\r
- * query ::= exp EQUALS exp\r
- */\r
- protected abstract Object reduceEqualsQuery();\r
- /**\r
- * query ::= exp BINDS exp\r
- */\r
- protected abstract Object reduceBindQuery();\r
- /**\r
- * query ::= QUERY_OP queryBlock\r
- */\r
- protected abstract Object reduceCompositeQuery();\r
- /**\r
- * queryBlock ::= LBRACE (query (SEMICOLON (query SEMICOLON)* query)?)? RBRACE\r
- */\r
- protected abstract Object reduceQueryBlock();\r
- /**\r
- * lexp ::= faexp faexp*\r
- */\r
- protected abstract Object reduceApply();\r
- /**\r
- * symbol ::= SYMBOL\r
- */\r
- protected abstract Object reduceSymbol();\r
- /**\r
- * symbol ::= ESCAPED_ID\r
- */\r
- protected abstract Object reduceEscapedId();\r
- /**\r
- * symbol ::= MINUS\r
- */\r
- protected abstract Object reduceMinus();\r
- /**\r
- * symbol ::= LESS\r
- */\r
- protected abstract Object reduceLess();\r
- /**\r
- * symbol ::= GREATER\r
- */\r
- protected abstract Object reduceGreater();\r
- /**\r
- * symbol ::= SEPARATED_DOT\r
- */\r
- protected abstract Object reduceDot();\r
- /**\r
- * faexp ::= aexp ((ATTACHED_HASH | ATTACHED_DOT) accessor)*\r
- */\r
- protected abstract Object reduceFieldAccess();\r
- /**\r
- * accessor ::= ID\r
- */\r
- protected abstract Object reduceIdAccessor();\r
- /**\r
- * accessor ::= BEGIN_STRING END_STRING\r
- */\r
- protected abstract Object reduceStringAccessor();\r
- /**\r
- * accessor ::= LPAREN exp RPAREN\r
- */\r
- protected abstract Object reduceExpAccessor();\r
- /**\r
- * case ::= exp caseRhs\r
- */\r
- protected abstract Object reduceCase();\r
- /**\r
- * stringLiteral ::= BEGIN_STRING (SUSPEND_STRING exp CONTINUE_STRING)* END_STRING\r
- */\r
- protected abstract Object reduceStringLiteral();\r
- /**\r
- * listQualifier ::= exp\r
- */\r
- protected abstract Object reduceGuardQualifier();\r
- /**\r
- * listQualifier ::= exp EQUALS exp\r
- */\r
- protected abstract Object reduceLetQualifier();\r
- /**\r
- * listQualifier ::= exp BINDS exp\r
- */\r
- protected abstract Object reduceBindQualifier();\r
- /**\r
- * listQualifier ::= THEN exp (BY exp)?\r
- */\r
- protected abstract Object reduceThenQualifier();\r
- /**\r
- * field ::= ID EQUALS exp\r
- */\r
- protected abstract Object reduceField();\r
- /**\r
- * field ::= ID\r
- */\r
- protected abstract Object reduceFieldShorthand();\r
- /**\r
- * chrQuery ::= (listQualifier COMMA)* listQualifier\r
- */\r
- protected abstract Object reduceCHRQuery();\r
- /**\r
- * verboseChrQuery ::= LBRACE listQualifier (SEMICOLON listQualifier)* RBRACE\r
- */\r
- protected abstract Object reduceVerboseCHRQuery();\r
- /**\r
- * caseRhs ::= ARROW exp (WHERE statements)?\r
- */\r
- protected abstract Object reduceSimpleCaseRhs();\r
- /**\r
- * caseRhs ::= guardedExpArrow guardedExpArrow* (WHERE statements)?\r
- */\r
- protected abstract Object reduceGuardedCaseRhs();\r
- /**\r
- * guardedExpArrow ::= BAR exp (COMMA exp)* ARROW exp\r
- */\r
- protected abstract Object reduceGuardedExpArrow();\r
- /**\r
- * equation ::= exp\r
- */\r
- protected abstract Object reduceGuardEquation();\r
- /**\r
- * equation ::= exp EQUALS exp\r
- */\r
- protected abstract Object reduceBasicEquation();\r
- /**\r
- * etype ::= LESS ID (COMMA ID)* GREATER btype\r
- */\r
- protected abstract Object reduceEffect();\r
- /**\r
- * etype ::= btype\r
- */\r
- protected abstract Object reduceJustEtype();\r
- /**\r
- * etype ::= FORALL ID ID* (SEPARATED_DOT | ATTACHED_DOT) type\r
- */\r
- protected abstract Object reduceForAll();\r
- /**\r
- * btype ::= atype atype*\r
- */\r
- protected abstract Object reduceApplyType();\r
- /**\r
- * dummy ::= COMMENT EOL\r
- */\r
- protected abstract Object reduceDummy1();\r
-\r
- protected void postReduce(Object reduced) {\r
- }\r
-\r
-}\r
+package org.simantics.scl.compiler.internal.parsing.parser;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import org.simantics.scl.compiler.internal.parsing.exceptions.SCLSyntaxErrorException;
+
+import org.simantics.scl.compiler.internal.parsing.Token;
+
+public abstract class SCLParser {
+ public static final boolean TRACE = false;
+
+ private static final int INITIAL_CAPACITY = 16;
+ private static final int STATE_COUNT = 362;
+ private static final int TERMINAL_COUNT = 85;
+ private static final int NONTERMINAL_COUNT = 52;
+ private static final int PRODUCT_COUNT = 138;
+
+ private static final int[] ACTION_ROW_ID = new int[STATE_COUNT];
+ private static final int[] ACTION_COLUMN_ID = new int[TERMINAL_COUNT];
+ private static final short[] ACTION_TABLE = new short[6832];
+ private static final int[] ERROR_TABLE = new int[962];
+ private static final int[] GOTO_ROW_ID = new int[STATE_COUNT];
+ private static final int[] GOTO_COLUMN_ID = new int[NONTERMINAL_COUNT];
+ private static final short[] GOTO_TABLE = new short[1953];
+ private static final int[] PRODUCT_LHS = new int[PRODUCT_COUNT];
+
+ private static final short STATE_MASK = (short)0x0fff;
+ private static final short REDUCE_MASK = (short)0x8000;
+ private static final short POP_MASK = (short)0x4000;
+ private static final short PUSH_MASK = (short)0x2000;
+ private static final short ERROR_ACTION = (short)0xffff;
+ private static final short ACCEPT_ACTION = (short)0xfffe;
+
+ public static final String[] TERMINAL_NAMES = new String[] {
+ "SEMICOLON",
+ "LBRACE",
+ "RBRACE",
+ "MODULE",
+ "COMMA",
+ "HASTYPE",
+ "DATA",
+ "ID",
+ "EQUALS",
+ "BAR",
+ "TYPE",
+ "CLASS",
+ "WHERE",
+ "INSTANCE",
+ "DERIVING",
+ "BEGIN_STRING",
+ "END_STRING",
+ "ANNOTATION_ID",
+ "INFIX",
+ "INFIXL",
+ "INFIXR",
+ "INTEGER",
+ "IMPORTJAVA",
+ "EFFECT",
+ "RULE",
+ "ABSTRACT_RULE",
+ "EXTENDS",
+ "MAPPING_RELATION",
+ "FOLLOWS",
+ "RULESET",
+ "IMPORT",
+ "INCLUDE",
+ "AS",
+ "LPAREN",
+ "RPAREN",
+ "HIDING",
+ "ARROW",
+ "COLON",
+ "MINUS",
+ "SYMBOL",
+ "LESS",
+ "GREATER",
+ "SEPARATED_DOT",
+ "ESCAPED_ID",
+ "LAMBDA",
+ "LAMBDA_MATCH",
+ "LET",
+ "IF",
+ "MATCH",
+ "DO",
+ "MDO",
+ "ENFORCE",
+ "BLANK",
+ "FLOAT",
+ "LBRACKET",
+ "ESCAPED_SYMBOL",
+ "CHAR",
+ "WHEN",
+ "ATTACHED_HASH",
+ "SELECT",
+ "SELECT_FIRST",
+ "SELECT_DISTINCT",
+ "TRANSFORMATION",
+ "EQ",
+ "CHR_SELECT",
+ "ATTACHED_DOT",
+ "IN",
+ "THEN",
+ "ELSE",
+ "WITH",
+ "RBRACKET",
+ "DOTDOT",
+ "AT",
+ "SUSPEND_STRING",
+ "CONTINUE_STRING",
+ "BINDS",
+ "IMPLIES",
+ "THEN_AFTER_WHEN",
+ "CONSTRAINT",
+ "BY",
+ "QUERY_OP",
+ "FORALL",
+ "COMMENT",
+ "EOL",
+ "EOF"
+ };
+
+ public static final String[] NONTERMINAL_NAMES = new String[] {
+ "module",
+ "commands",
+ "import",
+ "type",
+ "exp",
+ "equationBlock",
+ "declaration",
+ "command",
+ "statement",
+ "declarations",
+ "field",
+ "var",
+ "bexp",
+ "rhs",
+ "constructor",
+ "context",
+ "fundeps",
+ "atype",
+ "aexp",
+ "ruleDeclarations",
+ "statements",
+ "importSpec",
+ "importItem",
+ "fieldDeclaration",
+ "guardedExpEq",
+ "fundep",
+ "ruleDeclaration",
+ "query",
+ "lexp",
+ "symbol",
+ "faexp",
+ "accessor",
+ "case",
+ "queryBlock",
+ "verboseChrQuery",
+ "stringLiteral",
+ "symbolWithoutMinus",
+ "listQualifier",
+ "chrQuery",
+ "chrQueryPart",
+ "caseRhs",
+ "guardedExpArrow",
+ "equation",
+ "etype",
+ "btype",
+ "dummy",
+ "init$6",
+ "init$5",
+ "init$4",
+ "init$3",
+ "init$2",
+ "init$1"
+ };
+
+ static {
+ try {
+ DataInputStream input = new DataInputStream(SCLParser.class.getResourceAsStream("SCLParser.dat"));
+ for(int i=0;i<ACTION_ROW_ID.length;++i)
+ ACTION_ROW_ID[i] = input.readInt();
+ for(int i=0;i<ACTION_COLUMN_ID.length;++i)
+ ACTION_COLUMN_ID[i] = input.readInt();
+ for(int i=0;i<ACTION_TABLE.length;++i)
+ ACTION_TABLE[i] = input.readShort();
+ for(int i=0;i<ERROR_TABLE.length;++i)
+ ERROR_TABLE[i] = input.readInt();
+ for(int i=0;i<GOTO_ROW_ID.length;++i)
+ GOTO_ROW_ID[i] = input.readInt();
+ for(int i=0;i<GOTO_COLUMN_ID.length;++i)
+ GOTO_COLUMN_ID[i] = input.readInt();
+ for(int i=0;i<GOTO_TABLE.length;++i)
+ GOTO_TABLE[i] = input.readShort();
+ for(int i=0;i<PRODUCT_LHS.length;++i)
+ PRODUCT_LHS[i] = input.readInt();
+ input.close();
+ } catch(IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static short getAction(int state, int symbol) {
+ int id = TERMINAL_COUNT*state + symbol;
+ if( ((ERROR_TABLE[id>>5] >> (id&31))&1) != 0 )
+ return ERROR_ACTION;
+ return ACTION_TABLE[ACTION_ROW_ID[state] + ACTION_COLUMN_ID[symbol]];
+ }
+
+ private static short getGoto(int state, int symbol) {
+ return GOTO_TABLE[GOTO_ROW_ID[state] + GOTO_COLUMN_ID[symbol]];
+ }
+
+ protected abstract Token nextToken();
+
+ private Object[] symbolStack = new Object[INITIAL_CAPACITY];
+ private int symbolStackLength = 0;
+
+ private int[] stateStack = new int[INITIAL_CAPACITY];
+ private int[] symbolStackPositionStack = new int[INITIAL_CAPACITY];
+ private int stateStackLength = 0;
+
+ // For reduce
+ private int reductionLength;
+
+ protected int length() {
+ return reductionLength;
+ }
+
+ protected Object get(int i) {
+ if(i < 0 || i >= reductionLength)
+ throw new IndexOutOfBoundsException();
+ return symbolStack[symbolStackLength+i];
+ }
+
+ private String parseErrorDescription(int state, Token token, int tokenId) {
+ StringBuilder b = new StringBuilder();
+ b.append("Unexpected token '").append(token)
+ .append("' (").append(TERMINAL_NAMES[tokenId])
+ .append("). Expected one of ");
+ ArrayList<String> possibleTerminals = new ArrayList<String>();
+ for(int i=0;i<TERMINAL_COUNT;++i)
+ if(getAction(state, i) != ERROR_ACTION)
+ possibleTerminals.add(TERMINAL_NAMES[i]);
+ Collections.sort(possibleTerminals);
+ for(int i=0;i<possibleTerminals.size();++i) {
+ if(i > 0)
+ b.append(", ");
+ b.append(possibleTerminals.get(i));
+ }
+ b.append('.');
+ return b.toString();
+ }
+
+ protected abstract RuntimeException syntaxError(Token token, String description);
+
+ private static String describeAction(boolean isGoto, int action) {
+ if(action == ERROR_ACTION)
+ return "ERROR";
+ if(action == ACCEPT_ACTION)
+ return "ACCEPT";
+ StringBuilder b = new StringBuilder();
+ if(isGoto)
+ b.append("GOTO ");
+ else {
+ if((action & REDUCE_MASK) != 0) {
+ action ^= REDUCE_MASK;
+ b.append("REDUCE");
+ }
+ else
+ b.append("SHIFT");
+ }
+ if((action & POP_MASK) != 0) {
+ action ^= POP_MASK;
+ b.append(" POP");
+ }
+ if((action & PUSH_MASK) != 0) {
+ action ^= PUSH_MASK;
+ b.append(" PUSH");
+ }
+ b.append(' ').append(action);
+ return b.toString();
+ }
+
+ private void printState(int state) {
+ System.out.print("state=" + state + ":");
+ for(int i=symbolStackLength-1,j=stateStackLength-1;i>=0;--i) {
+ Object s = symbolStack[i];
+ if(s instanceof Token)
+ System.out.print(" " + TERMINAL_NAMES[((Token)s).id]);
+ else if(s == null)
+ System.out.print(" null");
+ else
+ System.out.print(" " + s.getClass().getSimpleName());
+ while(j>=0 && symbolStackPositionStack[j]==i)
+ System.out.print(" (" + stateStack[j--] + ")");
+ }
+ System.out.println();
+ }
+
+ private Object parse(int state) {
+ while(true) {
+ Token token = nextToken();
+ int tokenId = token.id;
+ if(TRACE)
+ System.out.println("---> token " + TERMINAL_NAMES[tokenId] + " \"" + token.text + "\" <---");
+ while(true) {
+ if(TRACE)
+ printState(state);
+ short action = getAction(state, tokenId);
+ if(TRACE)
+ System.out.println(" -> action=" + describeAction(false, action));
+ //System.out.println(STATE_DESCRIPTIONS[state]);
+ if((action & REDUCE_MASK) != 0) {
+ if(action == ACCEPT_ACTION)
+ return symbolStack[symbolStackLength-1];
+ if(action == ERROR_ACTION)
+ throw syntaxError(token, parseErrorDescription(state, token, tokenId));
+ int popAmount = (action >>> 13)&3;
+ if(TRACE) {
+ if(popAmount > 0)
+ System.out.println(" POP " + popAmount);
+ }
+ stateStackLength -= popAmount;
+ action &= STATE_MASK;
+
+ int reductionBegin = symbolStackPositionStack[--stateStackLength];
+
+ reductionLength = symbolStackLength-reductionBegin;
+ symbolStackLength = reductionBegin;
+
+ if(symbolStackLength == symbolStack.length)
+ symbolStack = Arrays.copyOf(symbolStack, symbolStackLength*2);
+ Object symbol = reduce(action);
+ postReduce(symbol);
+ symbolStack[symbolStackLength] = symbol;
+
+ state = stateStack[stateStackLength];
+ if(TRACE) {
+ ++symbolStackLength;
+ printState(state);
+ --symbolStackLength;
+ System.out.println(" nonterminal=" + NONTERMINAL_NAMES[PRODUCT_LHS[action]]);
+ }
+ action = getGoto(state, PRODUCT_LHS[action]);
+ if(TRACE)
+ System.out.println(" -> action=" + describeAction(true, action));
+
+ // Pop state
+ if((action & POP_MASK) != 0) {
+ --stateStackLength;
+ }
+ // Push state
+ if((action & PUSH_MASK) != 0) {
+ if(stateStackLength == stateStack.length) {
+ stateStack = Arrays.copyOf(stateStack, stateStackLength*2);
+ symbolStackPositionStack = Arrays.copyOf(symbolStackPositionStack, stateStackLength*2);
+ }
+ symbolStackPositionStack[stateStackLength] = symbolStackLength;
+ stateStack[stateStackLength++] = state;
+ }
+ state = action & STATE_MASK;
+ ++symbolStackLength;
+ }
+ else {
+ // Pop state
+ if((action & POP_MASK) != 0) {
+ --stateStackLength;
+ }
+ // Push state
+ if((action & PUSH_MASK) != 0) {
+ if(stateStackLength == stateStack.length) {
+ stateStack = Arrays.copyOf(stateStack, stateStackLength*2);
+ symbolStackPositionStack = Arrays.copyOf(symbolStackPositionStack, stateStackLength*2);
+ }
+ symbolStackPositionStack[stateStackLength] = symbolStackLength;
+ stateStack[stateStackLength++] = state;
+ }
+
+ // New state
+ state = action & STATE_MASK;
+
+ // Push symbol
+ if(symbolStackLength == symbolStack.length)
+ symbolStack = Arrays.copyOf(symbolStack, symbolStackLength*2);
+ symbolStack[symbolStackLength++] = token;
+ break;
+ }
+ }
+ }
+ }
+
+ public Object parseModule() {
+ return parse(0);
+ }
+ public Object parseCommands() {
+ return parse(346);
+ }
+ public Object parseImport() {
+ return parse(354);
+ }
+ public Object parseType() {
+ return parse(356);
+ }
+ public Object parseExp() {
+ return parse(358);
+ }
+ public Object parseEquationBlock() {
+ return parse(360);
+ }
+
+
+ protected Object reduce(int productionId) {
+ try {
+ switch(productionId) {
+ case 0:
+ return reduceModule();
+ case 1:
+ return reduceOneCommand();
+ case 2:
+ return reduceManyCommands();
+ case 3:
+ return reduceImport();
+ case 4:
+ return reduceArrow();
+ case 5:
+ return reduceLocalTypeAnnotation();
+ case 6:
+ return reduceEquationBlock();
+ case 7:
+ return reduceModuleHeader();
+ case 8:
+ return reduceTypeAnnotation();
+ case 9:
+ return reduceValueDefinition();
+ case 10:
+ return reduceDataDefinition();
+ case 11:
+ return reduceTypeDefinition();
+ case 12:
+ return reduceClassDefinition();
+ case 13:
+ return reduceInstanceDefinition();
+ case 14:
+ return reduceDerivingInstanceDefinition();
+ case 15:
+ return reduceDocumentationString();
+ case 16:
+ return reduceAnnotation();
+ case 17:
+ return reducePrecedenceDefinition();
+ case 18:
+ return reduceJustImport();
+ case 19:
+ return reduceImportJava();
+ case 20:
+ return reduceEffectDefinition();
+ case 21:
+ return reduceRuleDefinition();
+ case 22:
+ return reduceMappingRelationDefinition();
+ case 23:
+ return reduceRelationDefinition();
+ case 24:
+ return reduceRulesetDefinition();
+ case 25:
+ return reduceStatementCommand();
+ case 26:
+ return reduceImportCommand();
+ case 27:
+ return reduceGuardStatement();
+ case 28:
+ return reduceLetStatement();
+ case 29:
+ return reduceBindStatement();
+ case 30:
+ return reduceRuleStatement();
+ case 31:
+ return reduceCHRStatement();
+ case 32:
+ return reduceVerboseCHRStatement();
+ case 33:
+ return reduceConstraintStatement();
+ case 34:
+ return reduceLocalInclude();
+ case 35:
+ return reduceDeclarations();
+ case 36:
+ return reduceField();
+ case 37:
+ return reduceFieldShorthand();
+ case 38:
+ return reduceVarId();
+ case 39:
+ return reduceEscapedSymbol();
+ case 40:
+ return reduceTupleConstructor();
+ case 41:
+ return reduceBinary();
+ case 42:
+ return reduceSimpleRhs();
+ case 43:
+ return reduceGuardedRhs();
+ case 44:
+ return reduceConstructor();
+ case 45:
+ return reduceRecordConstructor();
+ case 46:
+ return reduceContext();
+ case 47:
+ return reduceFundeps();
+ case 48:
+ return reduceTypeVar();
+ case 49:
+ return reduceTupleType();
+ case 50:
+ return reduceListType();
+ case 51:
+ return reduceListTypeConstructor();
+ case 52:
+ return reduceTupleTypeConstructor();
+ case 53:
+ return reduceLambda();
+ case 54:
+ return reduceLambdaMatch();
+ case 55:
+ return reduceLet();
+ case 56:
+ return reduceIf();
+ case 57:
+ return reduceMatch();
+ case 58:
+ return reduceDo();
+ case 59:
+ return reduceSelect();
+ case 60:
+ return reduceCHRSelect();
+ case 61:
+ return reduceEnforce();
+ case 62:
+ return reduceVar();
+ case 63:
+ return reduceHashedId();
+ case 64:
+ return reduceBlank();
+ case 65:
+ return reduceInteger();
+ case 66:
+ return reduceFloat();
+ case 67:
+ return reduceString();
+ case 68:
+ return reduceChar();
+ case 69:
+ return reduceTuple();
+ case 70:
+ return reduceViewPattern();
+ case 71:
+ return reduceRightSection();
+ case 72:
+ return reduceLeftSection();
+ case 73:
+ return reduceListLiteral();
+ case 74:
+ return reduceRange();
+ case 75:
+ return reduceListComprehension();
+ case 76:
+ return reduceAs();
+ case 77:
+ return reduceRecord();
+ case 78:
+ return reduceTransformation();
+ case 79:
+ return reduceEq();
+ case 80:
+ return reduceRuleDeclarations();
+ case 81:
+ return reduceStatements();
+ case 82:
+ return reduceImportShowing();
+ case 83:
+ return reduceImportHiding();
+ case 84:
+ return reduceImportValueItem();
+ case 85:
+ return reduceFieldDescription();
+ case 86:
+ return reduceGuardedExpEq();
+ case 87:
+ return reduceFundep();
+ case 88:
+ return reduceQueryRuleDeclaration();
+ case 89:
+ return reduceAnnotation();
+ case 90:
+ return reduceGuardQuery();
+ case 91:
+ return reduceEqualsQuery();
+ case 92:
+ return reduceBindQuery();
+ case 93:
+ return reduceCompositeQuery();
+ case 94:
+ return reduceApply();
+ case 95:
+ return reduceSymbol();
+ case 96:
+ return reduceEscapedId();
+ case 97:
+ return reduceMinus();
+ case 98:
+ return reduceLess();
+ case 99:
+ return reduceGreater();
+ case 100:
+ return reduceDot();
+ case 101:
+ return reduceFieldAccess();
+ case 102:
+ return reduceIdAccessor();
+ case 103:
+ return reduceStringAccessor();
+ case 104:
+ return reduceExpAccessor();
+ case 105:
+ return reduceCase();
+ case 106:
+ return reduceQueryBlock();
+ case 107:
+ return reduceVerboseCHRConjunction();
+ case 108:
+ return reduceStringLiteral();
+ case 109:
+ return reduceSymbol();
+ case 110:
+ return reduceEscapedId();
+ case 111:
+ return reduceLess();
+ case 112:
+ return reduceGreater();
+ case 113:
+ return reduceDot();
+ case 114:
+ return reduceGuardQualifier();
+ case 115:
+ return reduceLetQualifier();
+ case 116:
+ return reduceBindQualifier();
+ case 117:
+ return reduceThenQualifier();
+ case 118:
+ return reduceCHRConjunction();
+ case 119:
+ return reduceCHRAtom();
+ case 120:
+ return reduceCHREquals();
+ case 121:
+ return reduceCHRBinds();
+ case 122:
+ return reduceSimpleCaseRhs();
+ case 123:
+ return reduceGuardedCaseRhs();
+ case 124:
+ return reduceGuardedExpArrow();
+ case 125:
+ return reduceGuardEquation();
+ case 126:
+ return reduceBasicEquation();
+ case 127:
+ return reduceEffect();
+ case 128:
+ return reduceJustEtype();
+ case 129:
+ return reduceForAll();
+ case 130:
+ return reduceApplyType();
+ case 131:
+ return reduceDummy();
+
+ default:
+ throw new RuntimeException("Internal parser error.");
+ }
+ } catch(SCLSyntaxErrorException e) {
+ StringBuilder b = new StringBuilder();
+ b.append("Failed to reduce");
+ for(int i=0;i<length();++i) {
+ Object obj = get(i);
+ b.append("\n (").append(i).append(") \"").append(obj).append('\"');
+ if(obj instanceof Token)
+ b.append(" (").append(TERMINAL_NAMES[((Token)obj).id]).append(")");
+ else
+ b.append(" [").append(obj.getClass().getSimpleName()).append("]");
+ }
+ throw new RuntimeException(b.toString(), e);
+ }
+ }
+
+ /**
+ * module ::= (declaration (SEMICOLON declaration)*)?
+ */
+ protected abstract Object reduceModule();
+ /**
+ * commands ::= command?
+ */
+ protected abstract Object reduceOneCommand();
+ /**
+ * commands ::= commands SEMICOLON command
+ */
+ protected abstract Object reduceManyCommands();
+ /**
+ * import ::= (IMPORT | INCLUDE) BEGIN_STRING END_STRING (AS ID)? importSpec?
+ */
+ protected abstract Object reduceImport();
+ /**
+ * type ::= (etype (ARROW | IMPLIES))* etype
+ */
+ protected abstract Object reduceArrow();
+ /**
+ * exp ::= bexp (HASTYPE type)?
+ */
+ protected abstract Object reduceLocalTypeAnnotation();
+ /**
+ * equationBlock ::= (equation (SEMICOLON equation)*)?
+ */
+ protected abstract Object reduceEquationBlock();
+ /**
+ * declaration ::= MODULE LBRACE (field (COMMA field)*)? RBRACE
+ */
+ protected abstract Object reduceModuleHeader();
+ /**
+ * declaration ::= (var COMMA)* var HASTYPE type
+ */
+ protected abstract Object reduceTypeAnnotation();
+ /**
+ * declaration ::= bexp rhs
+ */
+ protected abstract Object reduceValueDefinition();
+ /**
+ * declaration ::= DATA ID ID* (EQUALS (constructor BAR)* constructor)?
+ */
+ protected abstract Object reduceDataDefinition();
+ /**
+ * declaration ::= TYPE ID ID* EQUALS type
+ */
+ protected abstract Object reduceTypeDefinition();
+ /**
+ * declaration ::= CLASS context? ID ID* (BAR fundeps | (BAR fundeps)? WHERE declarations)?
+ */
+ protected abstract Object reduceClassDefinition();
+ /**
+ * declaration ::= INSTANCE context? ID atype atype* (WHERE declarations)?
+ */
+ protected abstract Object reduceInstanceDefinition();
+ /**
+ * declaration ::= DERIVING INSTANCE context? ID atype atype*
+ */
+ protected abstract Object reduceDerivingInstanceDefinition();
+ /**
+ * declaration ::= BEGIN_STRING END_STRING
+ */
+ protected abstract Object reduceDocumentationString();
+ /**
+ * declaration ::= ANNOTATION_ID aexp*
+ */
+ protected abstract Object reduceAnnotation();
+ /**
+ * declaration ::= (INFIX | INFIXL | INFIXR) INTEGER (var COMMA)* var
+ */
+ protected abstract Object reducePrecedenceDefinition();
+ /**
+ * declaration ::= import
+ */
+ protected abstract Object reduceJustImport();
+ /**
+ * declaration ::= IMPORTJAVA BEGIN_STRING END_STRING WHERE declarations
+ */
+ protected abstract Object reduceImportJava();
+ /**
+ * declaration ::= EFFECT ID BEGIN_STRING END_STRING BEGIN_STRING END_STRING
+ */
+ protected abstract Object reduceEffectDefinition();
+ /**
+ * declaration ::= (RULE | ABSTRACT_RULE) ID (EXTENDS (ID COMMA)* ID)? WHERE ruleDeclarations
+ */
+ protected abstract Object reduceRuleDefinition();
+ /**
+ * declaration ::= MAPPING_RELATION ID atype*
+ */
+ protected abstract Object reduceMappingRelationDefinition();
+ /**
+ * declaration ::= bexp FOLLOWS ruleDeclarations
+ */
+ protected abstract Object reduceRelationDefinition();
+ /**
+ * declaration ::= RULESET ID WHERE statements
+ */
+ protected abstract Object reduceRulesetDefinition();
+ /**
+ * command ::= statement
+ */
+ protected abstract Object reduceStatementCommand();
+ /**
+ * command ::= import
+ */
+ protected abstract Object reduceImportCommand();
+ /**
+ * statement ::= exp
+ */
+ protected abstract Object reduceGuardStatement();
+ /**
+ * statement ::= exp rhs
+ */
+ protected abstract Object reduceLetStatement();
+ /**
+ * statement ::= exp BINDS exp
+ */
+ protected abstract Object reduceBindStatement();
+ /**
+ * statement ::= exp FOLLOWS queryBlock
+ */
+ protected abstract Object reduceRuleStatement();
+ /**
+ * statement ::= chrQuery IMPLIES chrQuery
+ */
+ protected abstract Object reduceCHRStatement();
+ /**
+ * statement ::= WHEN verboseChrQuery THEN_AFTER_WHEN verboseChrQuery
+ */
+ protected abstract Object reduceVerboseCHRStatement();
+ /**
+ * statement ::= CONSTRAINT constructor
+ */
+ protected abstract Object reduceConstraintStatement();
+ /**
+ * statement ::= INCLUDE ID aexp
+ */
+ protected abstract Object reduceLocalInclude();
+ /**
+ * declarations ::= LBRACE (declaration (SEMICOLON (declaration SEMICOLON)* declaration)?)? RBRACE
+ */
+ protected abstract Object reduceDeclarations();
+ /**
+ * field ::= ID EQUALS exp
+ */
+ protected abstract Object reduceField();
+ /**
+ * field ::= ID
+ */
+ protected abstract Object reduceFieldShorthand();
+ /**
+ * var ::= ID
+ */
+ protected abstract Object reduceVarId();
+ /**
+ * var ::= ESCAPED_SYMBOL
+ */
+ protected abstract Object reduceEscapedSymbol();
+ /**
+ * var ::= LPAREN COMMA COMMA* RPAREN
+ */
+ protected abstract Object reduceTupleConstructor();
+ /**
+ * bexp ::= MINUS? lexp (symbol lexp)*
+ */
+ protected abstract Object reduceBinary();
+ /**
+ * rhs ::= EQUALS exp (WHERE statements)?
+ */
+ protected abstract Object reduceSimpleRhs();
+ /**
+ * rhs ::= guardedExpEq guardedExpEq* (WHERE statements)?
+ */
+ protected abstract Object reduceGuardedRhs();
+ /**
+ * constructor ::= (ANNOTATION_ID aexp)* ID atype*
+ */
+ protected abstract Object reduceConstructor();
+ /**
+ * constructor ::= (ANNOTATION_ID aexp)* ID LBRACE fieldDeclaration (COMMA fieldDeclaration)* RBRACE
+ */
+ protected abstract Object reduceRecordConstructor();
+ /**
+ * context ::= LPAREN type (COMMA type)* RPAREN IMPLIES
+ */
+ protected abstract Object reduceContext();
+ /**
+ * fundeps ::= (fundep COMMA)* fundep
+ */
+ protected abstract Object reduceFundeps();
+ /**
+ * atype ::= ID
+ */
+ protected abstract Object reduceTypeVar();
+ /**
+ * atype ::= LPAREN (type (COMMA (type COMMA)* type)?)? RPAREN
+ */
+ protected abstract Object reduceTupleType();
+ /**
+ * atype ::= LBRACKET type RBRACKET
+ */
+ protected abstract Object reduceListType();
+ /**
+ * atype ::= LBRACKET RBRACKET
+ */
+ protected abstract Object reduceListTypeConstructor();
+ /**
+ * atype ::= LPAREN COMMA COMMA* RPAREN
+ */
+ protected abstract Object reduceTupleTypeConstructor();
+ /**
+ * aexp ::= LAMBDA aexp aexp* ARROW exp
+ */
+ protected abstract Object reduceLambda();
+ /**
+ * aexp ::= LAMBDA_MATCH LBRACE case (SEMICOLON case)* RBRACE
+ */
+ protected abstract Object reduceLambdaMatch();
+ /**
+ * aexp ::= LET statements IN exp
+ */
+ protected abstract Object reduceLet();
+ /**
+ * aexp ::= IF exp THEN exp (ELSE exp)?
+ */
+ protected abstract Object reduceIf();
+ /**
+ * aexp ::= MATCH exp WITH LBRACE case (SEMICOLON case)* RBRACE
+ */
+ protected abstract Object reduceMatch();
+ /**
+ * aexp ::= (DO | MDO) statements
+ */
+ protected abstract Object reduceDo();
+ /**
+ * aexp ::= (SELECT | SELECT_FIRST | SELECT_DISTINCT) exp WHERE queryBlock
+ */
+ protected abstract Object reduceSelect();
+ /**
+ * aexp ::= CHR_SELECT exp WHERE verboseChrQuery
+ */
+ protected abstract Object reduceCHRSelect();
+ /**
+ * aexp ::= ENFORCE queryBlock
+ */
+ protected abstract Object reduceEnforce();
+ /**
+ * aexp ::= var
+ */
+ protected abstract Object reduceVar();
+ /**
+ * aexp ::= ATTACHED_HASH ID
+ */
+ protected abstract Object reduceHashedId();
+ /**
+ * aexp ::= BLANK
+ */
+ protected abstract Object reduceBlank();
+ /**
+ * aexp ::= INTEGER
+ */
+ protected abstract Object reduceInteger();
+ /**
+ * aexp ::= FLOAT
+ */
+ protected abstract Object reduceFloat();
+ /**
+ * aexp ::= stringLiteral
+ */
+ protected abstract Object reduceString();
+ /**
+ * aexp ::= CHAR
+ */
+ protected abstract Object reduceChar();
+ /**
+ * aexp ::= LPAREN (exp (COMMA (exp COMMA)* exp)?)? RPAREN
+ */
+ protected abstract Object reduceTuple();
+ /**
+ * aexp ::= LPAREN exp ARROW exp RPAREN
+ */
+ protected abstract Object reduceViewPattern();
+ /**
+ * aexp ::= LPAREN symbolWithoutMinus lexp RPAREN
+ */
+ protected abstract Object reduceRightSection();
+ /**
+ * aexp ::= LPAREN lexp symbol RPAREN
+ */
+ protected abstract Object reduceLeftSection();
+ /**
+ * aexp ::= LBRACKET (exp (COMMA (exp COMMA)* exp)?)? RBRACKET
+ */
+ protected abstract Object reduceListLiteral();
+ /**
+ * aexp ::= LBRACKET exp DOTDOT exp RBRACKET
+ */
+ protected abstract Object reduceRange();
+ /**
+ * aexp ::= LBRACKET exp BAR listQualifier (COMMA listQualifier)* RBRACKET
+ */
+ protected abstract Object reduceListComprehension();
+ /**
+ * aexp ::= ID AT aexp
+ */
+ protected abstract Object reduceAs();
+ /**
+ * aexp ::= ID LBRACE (field (COMMA field)*)? RBRACE
+ */
+ protected abstract Object reduceRecord();
+ /**
+ * aexp ::= TRANSFORMATION ID WHERE queryBlock
+ */
+ protected abstract Object reduceTransformation();
+ /**
+ * aexp ::= EQ LBRACE equationBlock RBRACE
+ */
+ protected abstract Object reduceEq();
+ /**
+ * ruleDeclarations ::= LBRACE (ruleDeclaration (SEMICOLON (ruleDeclaration SEMICOLON)* ruleDeclaration)?)? RBRACE
+ */
+ protected abstract Object reduceRuleDeclarations();
+ /**
+ * statements ::= LBRACE (statement (SEMICOLON (statement SEMICOLON)* statement)?)? RBRACE
+ */
+ protected abstract Object reduceStatements();
+ /**
+ * importSpec ::= LPAREN (importItem (COMMA (importItem COMMA)* importItem)?)? RPAREN
+ */
+ protected abstract Object reduceImportShowing();
+ /**
+ * importSpec ::= HIDING LPAREN (importItem (COMMA importItem)*)? RPAREN
+ */
+ protected abstract Object reduceImportHiding();
+ /**
+ * importItem ::= ID
+ */
+ protected abstract Object reduceImportValueItem();
+ /**
+ * fieldDeclaration ::= ID HASTYPE type
+ */
+ protected abstract Object reduceFieldDescription();
+ /**
+ * guardedExpEq ::= BAR exp (COMMA exp)* EQUALS exp
+ */
+ protected abstract Object reduceGuardedExpEq();
+ /**
+ * fundep ::= ID ID* ARROW ID
+ */
+ protected abstract Object reduceFundep();
+ /**
+ * ruleDeclaration ::= query
+ */
+ protected abstract Object reduceQueryRuleDeclaration();
+ /**
+ * query ::= exp
+ */
+ protected abstract Object reduceGuardQuery();
+ /**
+ * query ::= exp EQUALS exp
+ */
+ protected abstract Object reduceEqualsQuery();
+ /**
+ * query ::= exp BINDS exp
+ */
+ protected abstract Object reduceBindQuery();
+ /**
+ * query ::= QUERY_OP queryBlock
+ */
+ protected abstract Object reduceCompositeQuery();
+ /**
+ * lexp ::= faexp faexp*
+ */
+ protected abstract Object reduceApply();
+ /**
+ * symbol ::= SYMBOL
+ */
+ protected abstract Object reduceSymbol();
+ /**
+ * symbol ::= ESCAPED_ID
+ */
+ protected abstract Object reduceEscapedId();
+ /**
+ * symbol ::= MINUS
+ */
+ protected abstract Object reduceMinus();
+ /**
+ * symbol ::= LESS
+ */
+ protected abstract Object reduceLess();
+ /**
+ * symbol ::= GREATER
+ */
+ protected abstract Object reduceGreater();
+ /**
+ * symbol ::= SEPARATED_DOT
+ */
+ protected abstract Object reduceDot();
+ /**
+ * faexp ::= aexp ((ATTACHED_HASH | ATTACHED_DOT) accessor)*
+ */
+ protected abstract Object reduceFieldAccess();
+ /**
+ * accessor ::= ID
+ */
+ protected abstract Object reduceIdAccessor();
+ /**
+ * accessor ::= BEGIN_STRING END_STRING
+ */
+ protected abstract Object reduceStringAccessor();
+ /**
+ * accessor ::= LPAREN exp RPAREN
+ */
+ protected abstract Object reduceExpAccessor();
+ /**
+ * case ::= exp caseRhs
+ */
+ protected abstract Object reduceCase();
+ /**
+ * queryBlock ::= LBRACE (query (SEMICOLON (query SEMICOLON)* query)?)? RBRACE
+ */
+ protected abstract Object reduceQueryBlock();
+ /**
+ * verboseChrQuery ::= LBRACE chrQuery (SEMICOLON chrQuery)* RBRACE
+ */
+ protected abstract Object reduceVerboseCHRConjunction();
+ /**
+ * stringLiteral ::= BEGIN_STRING (SUSPEND_STRING exp CONTINUE_STRING)* END_STRING
+ */
+ protected abstract Object reduceStringLiteral();
+ /**
+ * listQualifier ::= exp
+ */
+ protected abstract Object reduceGuardQualifier();
+ /**
+ * listQualifier ::= exp EQUALS exp
+ */
+ protected abstract Object reduceLetQualifier();
+ /**
+ * listQualifier ::= exp BINDS exp
+ */
+ protected abstract Object reduceBindQualifier();
+ /**
+ * listQualifier ::= THEN exp (BY exp)?
+ */
+ protected abstract Object reduceThenQualifier();
+ /**
+ * chrQuery ::= (chrQueryPart COMMA)* chrQueryPart
+ */
+ protected abstract Object reduceCHRConjunction();
+ /**
+ * chrQueryPart ::= exp
+ */
+ protected abstract Object reduceCHRAtom();
+ /**
+ * chrQueryPart ::= exp EQUALS exp
+ */
+ protected abstract Object reduceCHREquals();
+ /**
+ * chrQueryPart ::= exp BINDS exp
+ */
+ protected abstract Object reduceCHRBinds();
+ /**
+ * caseRhs ::= ARROW exp (WHERE statements)?
+ */
+ protected abstract Object reduceSimpleCaseRhs();
+ /**
+ * caseRhs ::= guardedExpArrow guardedExpArrow* (WHERE statements)?
+ */
+ protected abstract Object reduceGuardedCaseRhs();
+ /**
+ * guardedExpArrow ::= BAR exp (COMMA exp)* ARROW exp
+ */
+ protected abstract Object reduceGuardedExpArrow();
+ /**
+ * equation ::= exp
+ */
+ protected abstract Object reduceGuardEquation();
+ /**
+ * equation ::= exp EQUALS exp
+ */
+ protected abstract Object reduceBasicEquation();
+ /**
+ * etype ::= LESS ID (COMMA ID)* GREATER btype
+ */
+ protected abstract Object reduceEffect();
+ /**
+ * etype ::= btype
+ */
+ protected abstract Object reduceJustEtype();
+ /**
+ * etype ::= FORALL ID ID* (SEPARATED_DOT | ATTACHED_DOT) type
+ */
+ protected abstract Object reduceForAll();
+ /**
+ * btype ::= atype atype*
+ */
+ protected abstract Object reduceApplyType();
+ /**
+ * dummy ::= COMMENT EOL
+ */
+ protected abstract Object reduceDummy();
+
+ protected void postReduce(Object reduced) {
+ }
+
+}