]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLParser.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / parsing / parser / SCLParser.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLParser.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLParser.java
new file mode 100644 (file)
index 0000000..bde7f10
--- /dev/null
@@ -0,0 +1,1103 @@
+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 = 323;\r
+    private static final int TERMINAL_COUNT = 79;\r
+    private static final int NONTERMINAL_COUNT = 49;\r
+    private static final int PRODUCT_COUNT = 126;\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[5508];\r
+    private static final int[] ERROR_TABLE = new int[798];\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[1620];\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
+        "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
+        "BY",\r
+        "QUERY_OP",\r
+        "IMPLIES",\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
+        "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(308);\r
+    }\r
+    public Object parseImport() {\r
+        return parse(315);\r
+    }\r
+    public Object parseType() {\r
+        return parse(317);\r
+    }\r
+    public Object parseExp() {\r
+        return parse(319);\r
+    }\r
+    public Object parseEquationBlock() {\r
+        return parse(321);\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 reduceDeclarations();\r
+        case 31:\r
+            return reduceVarId();\r
+        case 32:\r
+            return reduceEscapedSymbol();\r
+        case 33:\r
+            return reduceTupleConstructor();\r
+        case 34:\r
+            return reduceBinary();\r
+        case 35:\r
+            return reduceSimpleRhs();\r
+        case 36:\r
+            return reduceGuardedRhs();\r
+        case 37:\r
+            return reduceConstructor();\r
+        case 38:\r
+            return reduceRecordConstructor();\r
+        case 39:\r
+            return reduceContext();\r
+        case 40:\r
+            return reduceFundeps();\r
+        case 41:\r
+            return reduceTypeVar();\r
+        case 42:\r
+            return reduceTupleType();\r
+        case 43:\r
+            return reduceListType();\r
+        case 44:\r
+            return reduceListTypeConstructor();\r
+        case 45:\r
+            return reduceTupleTypeConstructor();\r
+        case 46:\r
+            return reduceLambda();\r
+        case 47:\r
+            return reduceLet();\r
+        case 48:\r
+            return reduceIf();\r
+        case 49:\r
+            return reduceMatch();\r
+        case 50:\r
+            return reduceDo();\r
+        case 51:\r
+            return reduceSelect();\r
+        case 52:\r
+            return reduceEnforce();\r
+        case 53:\r
+            return reduceWhen();\r
+        case 54:\r
+            return reduceVar();\r
+        case 55:\r
+            return reduceHashedId();\r
+        case 56:\r
+            return reduceBlank();\r
+        case 57:\r
+            return reduceInteger();\r
+        case 58:\r
+            return reduceFloat();\r
+        case 59:\r
+            return reduceString();\r
+        case 60:\r
+            return reduceChar();\r
+        case 61:\r
+            return reduceTuple();\r
+        case 62:\r
+            return reduceRightSection();\r
+        case 63:\r
+            return reduceLeftSection();\r
+        case 64:\r
+            return reduceListLiteral();\r
+        case 65:\r
+            return reduceRange();\r
+        case 66:\r
+            return reduceListComprehension();\r
+        case 67:\r
+            return reduceAs();\r
+        case 68:\r
+            return reduceRecord();\r
+        case 69:\r
+            return reduceTransformation();\r
+        case 70:\r
+            return reduceEq();\r
+        case 71:\r
+            return reduceRuleDeclarations();\r
+        case 72:\r
+            return reduceImportShowing();\r
+        case 73:\r
+            return reduceImportHiding();\r
+        case 74:\r
+            return reduceImportValueItem();\r
+        case 75:\r
+            return reduceFieldDescription();\r
+        case 76:\r
+            return reduceStatements();\r
+        case 77:\r
+            return reduceGuardedExpEq();\r
+        case 78:\r
+            return reduceFundep();\r
+        case 79:\r
+            return reduceQueryRuleDeclaration();\r
+        case 80:\r
+            return reduceAnnotation();\r
+        case 81:\r
+            return reduceGuardQuery();\r
+        case 82:\r
+            return reduceEqualsQuery();\r
+        case 83:\r
+            return reduceBindQuery();\r
+        case 84:\r
+            return reduceCompositeQuery();\r
+        case 85:\r
+            return reduceQueryBlock();\r
+        case 86:\r
+            return reduceApply();\r
+        case 87:\r
+            return reduceSymbol();\r
+        case 88:\r
+            return reduceEscapedId();\r
+        case 89:\r
+            return reduceMinus();\r
+        case 90:\r
+            return reduceLess();\r
+        case 91:\r
+            return reduceGreater();\r
+        case 92:\r
+            return reduceDot();\r
+        case 93:\r
+            return reduceFieldAccess();\r
+        case 94:\r
+            return reduceIdAccessor();\r
+        case 95:\r
+            return reduceStringAccessor();\r
+        case 96:\r
+            return reduceExpAccessor();\r
+        case 97:\r
+            return reduceCase();\r
+        case 98:\r
+            return reduceStringLiteral();\r
+        case 99:\r
+            return reduceSymbol();\r
+        case 100:\r
+            return reduceEscapedId();\r
+        case 101:\r
+            return reduceLess();\r
+        case 102:\r
+            return reduceGreater();\r
+        case 103:\r
+            return reduceDot();\r
+        case 104:\r
+            return reduceGuardQualifier();\r
+        case 105:\r
+            return reduceLetQualifier();\r
+        case 106:\r
+            return reduceBindQualifier();\r
+        case 107:\r
+            return reduceThenQualifier();\r
+        case 108:\r
+            return reduceField();\r
+        case 109:\r
+            return reduceFieldShorthand();\r
+        case 110:\r
+            return reduceSimpleCaseRhs();\r
+        case 111:\r
+            return reduceGuardedCaseRhs();\r
+        case 112:\r
+            return reduceGuardedExpArrow();\r
+        case 113:\r
+            return reduceGuardEquation();\r
+        case 114:\r
+            return reduceBasicEquation();\r
+        case 115:\r
+            return reduceEffect();\r
+        case 116:\r
+            return reduceJustEtype();\r
+        case 117:\r
+            return reduceForAll();\r
+        case 118:\r
+            return reduceApplyType();\r
+        case 119:\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
+     * 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 ::= 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 ::= WHEN queryBlock SEMICOLON exp\r
+     */\r
+    protected abstract Object reduceWhen();\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 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)&#42; 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
+     * 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