]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLParser.java
(refs #7601) Wildcard syntax for SCL records
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / parsing / parser / SCLParser.java
index 1679a019ea267c266466369e77a724403b61817e..6852771b1b8558f107758215e1e557d31dc56cf2 100644 (file)
-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)&#42;)?\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))&#42; 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)&#42;)?\r
-     */\r
-    protected abstract Object reduceEquationBlock();\r
-    /**\r
-     * declaration ::= (var COMMA)&#42; 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&#42; (EQUALS (constructor BAR)&#42; constructor)?\r
-     */\r
-    protected abstract Object reduceDataDefinition();\r
-    /**\r
-     * declaration ::= TYPE ID ID&#42; EQUALS type\r
-     */\r
-    protected abstract Object reduceTypeDefinition();\r
-    /**\r
-     * declaration ::= CLASS context? ID ID&#42; (BAR fundeps | (BAR fundeps)? WHERE declarations)?\r
-     */\r
-    protected abstract Object reduceClassDefinition();\r
-    /**\r
-     * declaration ::= INSTANCE context? ID atype atype&#42; (WHERE declarations)?\r
-     */\r
-    protected abstract Object reduceInstanceDefinition();\r
-    /**\r
-     * declaration ::= DERIVING INSTANCE context? ID atype atype&#42;\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&#42;\r
-     */\r
-    protected abstract Object reduceAnnotation();\r
-    /**\r
-     * declaration ::= (INFIX | INFIXL | INFIXR) INTEGER (var COMMA)&#42; 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)&#42; ID)? WHERE ruleDeclarations\r
-     */\r
-    protected abstract Object reduceRuleDefinition();\r
-    /**\r
-     * declaration ::= MAPPING_RELATION ID atype&#42;\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&#42;\r
-     */\r
-    protected abstract Object reduceConstraintStatement();\r
-    /**\r
-     * declarations ::= LBRACE (declaration (SEMICOLON (declaration SEMICOLON)&#42; 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&#42; RPAREN\r
-     */\r
-    protected abstract Object reduceTupleConstructor();\r
-    /**\r
-     * bexp ::= MINUS? lexp (symbol lexp)&#42;\r
-     */\r
-    protected abstract Object reduceBinary();\r
-    /**\r
-     * rhs ::= EQUALS exp (WHERE statements)?\r
-     */\r
-    protected abstract Object reduceSimpleRhs();\r
-    /**\r
-     * rhs ::= guardedExpEq guardedExpEq&#42; (WHERE statements)?\r
-     */\r
-    protected abstract Object reduceGuardedRhs();\r
-    /**\r
-     * constructor ::= (ANNOTATION_ID aexp)&#42; ID atype&#42;\r
-     */\r
-    protected abstract Object reduceConstructor();\r
-    /**\r
-     * constructor ::= (ANNOTATION_ID aexp)&#42; ID LBRACE fieldDeclaration (COMMA fieldDeclaration)&#42; RBRACE\r
-     */\r
-    protected abstract Object reduceRecordConstructor();\r
-    /**\r
-     * context ::= LPAREN type (COMMA type)&#42; RPAREN IMPLIES\r
-     */\r
-    protected abstract Object reduceContext();\r
-    /**\r
-     * fundeps ::= (fundep COMMA)&#42; 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)&#42; 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&#42; RPAREN\r
-     */\r
-    protected abstract Object reduceTupleTypeConstructor();\r
-    /**\r
-     * aexp ::= LAMBDA aexp aexp&#42; ARROW exp\r
-     */\r
-    protected abstract Object reduceLambda();\r
-    /**\r
-     * aexp ::= LAMBDA_MATCH LBRACE case (SEMICOLON case)&#42; 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)&#42; 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)&#42; 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)&#42; 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)&#42; 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)&#42;)? 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)&#42; ruleDeclaration)?)? RBRACE\r
-     */\r
-    protected abstract Object reduceRuleDeclarations();\r
-    /**\r
-     * importSpec ::= LPAREN (importItem (COMMA (importItem COMMA)&#42; importItem)?)? RPAREN\r
-     */\r
-    protected abstract Object reduceImportShowing();\r
-    /**\r
-     * importSpec ::= HIDING LPAREN (importItem (COMMA importItem)&#42;)? 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)&#42; statement)?)? RBRACE\r
-     */\r
-    protected abstract Object reduceStatements();\r
-    /**\r
-     * guardedExpEq ::= BAR exp (COMMA exp)&#42; EQUALS exp\r
-     */\r
-    protected abstract Object reduceGuardedExpEq();\r
-    /**\r
-     * fundep ::= ID ID&#42; 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)&#42; query)?)? RBRACE\r
-     */\r
-    protected abstract Object reduceQueryBlock();\r
-    /**\r
-     * lexp ::= faexp faexp&#42;\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)&#42;\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)&#42; 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)&#42; listQualifier\r
-     */\r
-    protected abstract Object reduceCHRQuery();\r
-    /**\r
-     * verboseChrQuery ::= LBRACE listQualifier (SEMICOLON listQualifier)&#42; 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&#42; (WHERE statements)?\r
-     */\r
-    protected abstract Object reduceGuardedCaseRhs();\r
-    /**\r
-     * guardedExpArrow ::= BAR exp (COMMA exp)&#42; 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)&#42; GREATER btype\r
-     */\r
-    protected abstract Object reduceEffect();\r
-    /**\r
-     * etype ::= btype\r
-     */\r
-    protected abstract Object reduceJustEtype();\r
-    /**\r
-     * etype ::= FORALL ID ID&#42; (SEPARATED_DOT | ATTACHED_DOT) type\r
-     */\r
-    protected abstract Object reduceForAll();\r
-    /**\r
-     * btype ::= atype atype&#42;\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 = 363;
+    private static final int TERMINAL_COUNT = 86;
+    private static final int NONTERMINAL_COUNT = 52;
+    private static final int PRODUCT_COUNT = 139;
+    
+    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[6765];
+    private static final int[] ERROR_TABLE = new int[976];
+    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",
+        "EDO",
+        "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(347);
+    }
+    public Object parseImport() {
+        return parse(355);
+    }
+    public Object parseType() {
+        return parse(357);
+    }
+    public Object parseExp() {
+        return parse(359);
+    }
+    public Object parseEquationBlock() {
+        return parse(361);
+    }
+
+
+    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 reduceWildcard();
+        case 39:
+            return reduceVarId();
+        case 40:
+            return reduceEscapedSymbol();
+        case 41:
+            return reduceTupleConstructor();
+        case 42:
+            return reduceBinary();
+        case 43:
+            return reduceSimpleRhs();
+        case 44:
+            return reduceGuardedRhs();
+        case 45:
+            return reduceConstructor();
+        case 46:
+            return reduceRecordConstructor();
+        case 47:
+            return reduceContext();
+        case 48:
+            return reduceFundeps();
+        case 49:
+            return reduceTypeVar();
+        case 50:
+            return reduceTupleType();
+        case 51:
+            return reduceListType();
+        case 52:
+            return reduceListTypeConstructor();
+        case 53:
+            return reduceTupleTypeConstructor();
+        case 54:
+            return reduceLambda();
+        case 55:
+            return reduceLambdaMatch();
+        case 56:
+            return reduceLet();
+        case 57:
+            return reduceIf();
+        case 58:
+            return reduceMatch();
+        case 59:
+            return reduceDo();
+        case 60:
+            return reduceSelect();
+        case 61:
+            return reduceCHRSelect();
+        case 62:
+            return reduceEnforce();
+        case 63:
+            return reduceVar();
+        case 64:
+            return reduceHashedId();
+        case 65:
+            return reduceBlank();
+        case 66:
+            return reduceInteger();
+        case 67:
+            return reduceFloat();
+        case 68:
+            return reduceString();
+        case 69:
+            return reduceChar();
+        case 70:
+            return reduceTuple();
+        case 71:
+            return reduceViewPattern();
+        case 72:
+            return reduceRightSection();
+        case 73:
+            return reduceLeftSection();
+        case 74:
+            return reduceListLiteral();
+        case 75:
+            return reduceRange();
+        case 76:
+            return reduceListComprehension();
+        case 77:
+            return reduceAs();
+        case 78:
+            return reduceRecord();
+        case 79:
+            return reduceTransformation();
+        case 80:
+            return reduceEq();
+        case 81:
+            return reduceRuleDeclarations();
+        case 82:
+            return reduceStatements();
+        case 83:
+            return reduceImportShowing();
+        case 84:
+            return reduceImportHiding();
+        case 85:
+            return reduceImportValueItem();
+        case 86:
+            return reduceFieldDescription();
+        case 87:
+            return reduceGuardedExpEq();
+        case 88:
+            return reduceFundep();
+        case 89:
+            return reduceQueryRuleDeclaration();
+        case 90:
+            return reduceAnnotation();
+        case 91:
+            return reduceGuardQuery();
+        case 92:
+            return reduceEqualsQuery();
+        case 93:
+            return reduceBindQuery();
+        case 94:
+            return reduceCompositeQuery();
+        case 95:
+            return reduceApply();
+        case 96:
+            return reduceSymbol();
+        case 97:
+            return reduceEscapedId();
+        case 98:
+            return reduceMinus();
+        case 99:
+            return reduceLess();
+        case 100:
+            return reduceGreater();
+        case 101:
+            return reduceDot();
+        case 102:
+            return reduceFieldAccess();
+        case 103:
+            return reduceIdAccessor();
+        case 104:
+            return reduceStringAccessor();
+        case 105:
+            return reduceExpAccessor();
+        case 106:
+            return reduceCase();
+        case 107:
+            return reduceQueryBlock();
+        case 108:
+            return reduceVerboseCHRConjunction();
+        case 109:
+            return reduceStringLiteral();
+        case 110:
+            return reduceSymbol();
+        case 111:
+            return reduceEscapedId();
+        case 112:
+            return reduceLess();
+        case 113:
+            return reduceGreater();
+        case 114:
+            return reduceDot();
+        case 115:
+            return reduceGuardQualifier();
+        case 116:
+            return reduceLetQualifier();
+        case 117:
+            return reduceBindQualifier();
+        case 118:
+            return reduceThenQualifier();
+        case 119:
+            return reduceCHRConjunction();
+        case 120:
+            return reduceCHRAtom();
+        case 121:
+            return reduceCHREquals();
+        case 122:
+            return reduceCHRBinds();
+        case 123:
+            return reduceSimpleCaseRhs();
+        case 124:
+            return reduceGuardedCaseRhs();
+        case 125:
+            return reduceGuardedExpArrow();
+        case 126:
+            return reduceGuardEquation();
+        case 127:
+            return reduceBasicEquation();
+        case 128:
+            return reduceEffect();
+        case 129:
+            return reduceJustEtype();
+        case 130:
+            return reduceForAll();
+        case 131:
+            return reduceApplyType();
+        case 132:
+            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)&#42;)?
+     */
+    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))&#42; etype
+     */
+    protected abstract Object reduceArrow();
+    /**
+     * exp ::= bexp (HASTYPE type)?
+     */
+    protected abstract Object reduceLocalTypeAnnotation();
+    /**
+     * equationBlock ::= (equation (SEMICOLON equation)&#42;)?
+     */
+    protected abstract Object reduceEquationBlock();
+    /**
+     * declaration ::= MODULE LBRACE (field (COMMA field)&#42;)? RBRACE
+     */
+    protected abstract Object reduceModuleHeader();
+    /**
+     * declaration ::= (var COMMA)&#42; var HASTYPE type
+     */
+    protected abstract Object reduceTypeAnnotation();
+    /**
+     * declaration ::= bexp rhs
+     */
+    protected abstract Object reduceValueDefinition();
+    /**
+     * declaration ::= DATA ID ID&#42; (EQUALS (constructor BAR)&#42; constructor)?
+     */
+    protected abstract Object reduceDataDefinition();
+    /**
+     * declaration ::= TYPE ID ID&#42; EQUALS type
+     */
+    protected abstract Object reduceTypeDefinition();
+    /**
+     * declaration ::= CLASS context? ID ID&#42; (BAR fundeps | (BAR fundeps)? WHERE declarations)?
+     */
+    protected abstract Object reduceClassDefinition();
+    /**
+     * declaration ::= INSTANCE context? ID atype atype&#42; (WHERE declarations)?
+     */
+    protected abstract Object reduceInstanceDefinition();
+    /**
+     * declaration ::= DERIVING INSTANCE context? ID atype atype&#42;
+     */
+    protected abstract Object reduceDerivingInstanceDefinition();
+    /**
+     * declaration ::= BEGIN_STRING END_STRING
+     */
+    protected abstract Object reduceDocumentationString();
+    /**
+     * declaration ::= ANNOTATION_ID aexp&#42;
+     */
+    protected abstract Object reduceAnnotation();
+    /**
+     * declaration ::= (INFIX | INFIXL | INFIXR) INTEGER (var COMMA)&#42; 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)&#42; ID)? WHERE ruleDeclarations
+     */
+    protected abstract Object reduceRuleDefinition();
+    /**
+     * declaration ::= MAPPING_RELATION ID atype&#42;
+     */
+    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)&#42; declaration)?)? RBRACE
+     */
+    protected abstract Object reduceDeclarations();
+    /**
+     * field ::= ID EQUALS exp
+     */
+    protected abstract Object reduceField();
+    /**
+     * field ::= ID
+     */
+    protected abstract Object reduceFieldShorthand();
+    /**
+     * field ::= DOTDOT
+     */
+    protected abstract Object reduceWildcard();
+    /**
+     * var ::= ID
+     */
+    protected abstract Object reduceVarId();
+    /**
+     * var ::= ESCAPED_SYMBOL
+     */
+    protected abstract Object reduceEscapedSymbol();
+    /**
+     * var ::= LPAREN COMMA COMMA&#42; RPAREN
+     */
+    protected abstract Object reduceTupleConstructor();
+    /**
+     * bexp ::= MINUS? lexp (symbol lexp)&#42;
+     */
+    protected abstract Object reduceBinary();
+    /**
+     * rhs ::= EQUALS exp (WHERE statements)?
+     */
+    protected abstract Object reduceSimpleRhs();
+    /**
+     * rhs ::= guardedExpEq guardedExpEq&#42; (WHERE statements)?
+     */
+    protected abstract Object reduceGuardedRhs();
+    /**
+     * constructor ::= (ANNOTATION_ID aexp)&#42; ID atype&#42;
+     */
+    protected abstract Object reduceConstructor();
+    /**
+     * constructor ::= (ANNOTATION_ID aexp)&#42; ID LBRACE fieldDeclaration (COMMA fieldDeclaration)&#42; RBRACE
+     */
+    protected abstract Object reduceRecordConstructor();
+    /**
+     * context ::= LPAREN type (COMMA type)&#42; RPAREN IMPLIES
+     */
+    protected abstract Object reduceContext();
+    /**
+     * fundeps ::= (fundep COMMA)&#42; fundep
+     */
+    protected abstract Object reduceFundeps();
+    /**
+     * atype ::= ID
+     */
+    protected abstract Object reduceTypeVar();
+    /**
+     * atype ::= LPAREN (type (COMMA (type COMMA)&#42; 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&#42; RPAREN
+     */
+    protected abstract Object reduceTupleTypeConstructor();
+    /**
+     * aexp ::= LAMBDA aexp aexp&#42; ARROW exp
+     */
+    protected abstract Object reduceLambda();
+    /**
+     * aexp ::= LAMBDA_MATCH LBRACE case (SEMICOLON case)&#42; 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)&#42; RBRACE
+     */
+    protected abstract Object reduceMatch();
+    /**
+     * aexp ::= (DO | MDO | EDO) 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)&#42; 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)&#42; exp)?)? RBRACKET
+     */
+    protected abstract Object reduceListLiteral();
+    /**
+     * aexp ::= LBRACKET exp DOTDOT exp RBRACKET
+     */
+    protected abstract Object reduceRange();
+    /**
+     * aexp ::= LBRACKET exp BAR listQualifier (COMMA listQualifier)&#42; RBRACKET
+     */
+    protected abstract Object reduceListComprehension();
+    /**
+     * aexp ::= ID AT aexp
+     */
+    protected abstract Object reduceAs();
+    /**
+     * aexp ::= ID LBRACE (field (COMMA field)&#42;)? 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)&#42; ruleDeclaration)?)? RBRACE
+     */
+    protected abstract Object reduceRuleDeclarations();
+    /**
+     * statements ::= LBRACE (statement (SEMICOLON (statement SEMICOLON)&#42; statement)?)? RBRACE
+     */
+    protected abstract Object reduceStatements();
+    /**
+     * importSpec ::= LPAREN (importItem (COMMA (importItem COMMA)&#42; importItem)?)? RPAREN
+     */
+    protected abstract Object reduceImportShowing();
+    /**
+     * importSpec ::= HIDING LPAREN (importItem (COMMA importItem)&#42;)? RPAREN
+     */
+    protected abstract Object reduceImportHiding();
+    /**
+     * importItem ::= ID
+     */
+    protected abstract Object reduceImportValueItem();
+    /**
+     * fieldDeclaration ::= ID HASTYPE type
+     */
+    protected abstract Object reduceFieldDescription();
+    /**
+     * guardedExpEq ::= BAR exp (COMMA exp)&#42; EQUALS exp
+     */
+    protected abstract Object reduceGuardedExpEq();
+    /**
+     * fundep ::= ID ID&#42; 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&#42;
+     */
+    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)&#42;
+     */
+    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)&#42; query)?)? RBRACE
+     */
+    protected abstract Object reduceQueryBlock();
+    /**
+     * verboseChrQuery ::= LBRACE chrQuery (SEMICOLON chrQuery)&#42; RBRACE
+     */
+    protected abstract Object reduceVerboseCHRConjunction();
+    /**
+     * stringLiteral ::= BEGIN_STRING (SUSPEND_STRING exp CONTINUE_STRING)&#42; 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)&#42; 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&#42; (WHERE statements)?
+     */
+    protected abstract Object reduceGuardedCaseRhs();
+    /**
+     * guardedExpArrow ::= BAR exp (COMMA exp)&#42; 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)&#42; GREATER btype
+     */
+    protected abstract Object reduceEffect();
+    /**
+     * etype ::= btype
+     */
+    protected abstract Object reduceJustEtype();
+    /**
+     * etype ::= FORALL ID ID&#42; (SEPARATED_DOT | ATTACHED_DOT) type
+     */
+    protected abstract Object reduceForAll();
+    /**
+     * btype ::= atype atype&#42;
+     */
+    protected abstract Object reduceApplyType();
+    /**
+     * dummy ::= COMMENT EOL
+     */
+    protected abstract Object reduceDummy();
+
+    protected void postReduce(Object reduced) {
+    }
+
+}