/* This file was generated by SableCC (http://www.sablecc.org/). */

package uk.co.zonetora.fj.ast.parser;

import uk.co.zonetora.fj.ast.lexer.*;
import uk.co.zonetora.fj.ast.node.*;
import uk.co.zonetora.fj.ast.analysis.*;
import java.util.*;

import java.io.DataInputStream;
import java.io.BufferedInputStream;
import java.io.IOException;

public class Parser
{
    public final Analysis ignoredTokens = new AnalysisAdapter();

    protected Node node;

    private final Lexer lexer;
    private final ListIterator stack = new LinkedList().listIterator();
    private int last_shift;
    private int last_pos;
    private int last_line;
    private Token last_token;
    private final TokenIndex converter = new TokenIndex();
    private final int[] action = new int[2];

    private final static int SHIFT = 0;
    private final static int REDUCE = 1;
    private final static int ACCEPT = 2;
    private final static int ERROR = 3;

    protected void filter() throws ParserException, LexerException, IOException
    {
    }

    public Parser(Lexer lexer)
    {
        this.lexer = lexer;

        if(actionTable == null)
        {
            try
            {
                DataInputStream s = new DataInputStream(
                    new BufferedInputStream(
                    Parser.class.getResourceAsStream("parser.dat")));

                // read actionTable
                int length = s.readInt();
                actionTable = new int[length][][];
                for(int i = 0; i < actionTable.length; i++)
                {
                    length = s.readInt();
                    actionTable[i] = new int[length][3];
                    for(int j = 0; j < actionTable[i].length; j++)
                    {
                        for(int k = 0; k < 3; k++)
                        {
                            actionTable[i][j][k] = s.readInt();
                        }
                    }
                }

                // read gotoTable
                length = s.readInt();
                gotoTable = new int[length][][];
                for(int i = 0; i < gotoTable.length; i++)
                {
                    length = s.readInt();
                    gotoTable[i] = new int[length][2];
                    for(int j = 0; j < gotoTable[i].length; j++)
                    {
                        for(int k = 0; k < 2; k++)
                        {
                            gotoTable[i][j][k] = s.readInt();
                        }
                    }
                }

                // read errorMessages
                length = s.readInt();
                errorMessages = new String[length];
                for(int i = 0; i < errorMessages.length; i++)
                {
                    length = s.readInt();
                    StringBuffer buffer = new StringBuffer();

                    for(int j = 0; j < length; j++)
                    {
                        buffer.append(s.readChar());
                    }
                    errorMessages[i] = buffer.toString();
                }

                // read errors
                length = s.readInt();
                errors = new int[length];
                for(int i = 0; i < errors.length; i++)
                {
                    errors[i] = s.readInt();
                }

                s.close();
            }
            catch(Exception e)
            {
                throw new RuntimeException("The file \"parser.dat\" is either missing or corrupted.");
            }
        }
    }

    private int goTo(int index)
    {
        int state = state();
        int low = 1;
        int high = gotoTable[index].length - 1;
        int value = gotoTable[index][0][1];

        while(low <= high)
        {
            int middle = (low + high) / 2;

            if(state < gotoTable[index][middle][0])
            {
                high = middle - 1;
            }
            else if(state > gotoTable[index][middle][0])
            {
                low = middle + 1;
            }
            else
            {
                value = gotoTable[index][middle][1];
                break;
            }
        }

        return value;
    }

    private void push(int state, Node node, boolean filter) throws ParserException, LexerException, IOException
    {
        this.node = node;

        if(filter)
        {
            filter();
        }

        if(!stack.hasNext())
        {
            stack.add(new State(state, this.node));
            return;
        }

        State s = (State) stack.next();
        s.state = state;
        s.node = this.node;
    }

    private int state()
    {
        State s = (State) stack.previous();
        stack.next();
        return s.state;
    }

    private Node pop()
    {
        return (Node) ((State) stack.previous()).node;
    }

    private int index(Switchable token)
    {
        converter.index = -1;
        token.apply(converter);
        return converter.index;
    }

    public Start parse() throws ParserException, LexerException, IOException
    {
        push(0, null, false);

        List ign = null;
        while(true)
        {
            while(index(lexer.peek()) == -1)
            {
                if(ign == null)
                {
                    ign = new TypedLinkedList(NodeCast.instance);
                }

                ign.add(lexer.next());
            }

            if(ign != null)
            {
                ignoredTokens.setIn(lexer.peek(), ign);
                ign = null;
            }

            last_pos = lexer.peek().getPos();
            last_line = lexer.peek().getLine();
            last_token = lexer.peek();

            int index = index(lexer.peek());
            action[0] = actionTable[state()][0][1];
            action[1] = actionTable[state()][0][2];

            int low = 1;
            int high = actionTable[state()].length - 1;

            while(low <= high)
            {
                int middle = (low + high) / 2;

                if(index < actionTable[state()][middle][0])
                {
                    high = middle - 1;
                }
                else if(index > actionTable[state()][middle][0])
                {
                    low = middle + 1;
                }
                else
                {
                    action[0] = actionTable[state()][middle][1];
                    action[1] = actionTable[state()][middle][2];
                    break;
                }
            }

            switch(action[0])
            {
                case SHIFT:
                    push(action[1], lexer.next(), true);
                    last_shift = action[1];
                    break;
                case REDUCE:
                    switch(action[1])
                    {
                    case 0: { Node node = new0(); push(goTo(0), node, true); } break;
                    case 1: { Node node = new1(); push(goTo(0), node, true); } break;
                    case 2: { Node node = new2(); push(goTo(16), node, false); } break;
                    case 3: { Node node = new3(); push(goTo(16), node, false); } break;
                    case 4: { Node node = new4(); push(goTo(1), node, true); } break;
                    case 5: { Node node = new5(); push(goTo(1), node, true); } break;
                    case 6: { Node node = new6(); push(goTo(17), node, false); } break;
                    case 7: { Node node = new7(); push(goTo(17), node, false); } break;
                    case 8: { Node node = new8(); push(goTo(1), node, true); } break;
                    case 9: { Node node = new9(); push(goTo(18), node, false); } break;
                    case 10: { Node node = new10(); push(goTo(18), node, false); } break;
                    case 11: { Node node = new11(); push(goTo(1), node, true); } break;
                    case 12: { Node node = new12(); push(goTo(2), node, true); } break;
                    case 13: { Node node = new13(); push(goTo(3), node, true); } break;
                    case 14: { Node node = new14(); push(goTo(3), node, true); } break;
                    case 15: { Node node = new15(); push(goTo(19), node, false); } break;
                    case 16: { Node node = new16(); push(goTo(19), node, false); } break;
                    case 17: { Node node = new17(); push(goTo(4), node, true); } break;
                    case 18: { Node node = new18(); push(goTo(5), node, true); } break;
                    case 19: { Node node = new19(); push(goTo(5), node, true); } break;
                    case 20: { Node node = new20(); push(goTo(20), node, false); } break;
                    case 21: { Node node = new21(); push(goTo(20), node, false); } break;
                    case 22: { Node node = new22(); push(goTo(5), node, true); } break;
                    case 23: { Node node = new23(); push(goTo(6), node, true); } break;
                    case 24: { Node node = new24(); push(goTo(6), node, true); } break;
                    case 25: { Node node = new25(); push(goTo(7), node, true); } break;
                    case 26: { Node node = new26(); push(goTo(8), node, true); } break;
                    case 27: { Node node = new27(); push(goTo(8), node, true); } break;
                    case 28: { Node node = new28(); push(goTo(21), node, false); } break;
                    case 29: { Node node = new29(); push(goTo(21), node, false); } break;
                    case 30: { Node node = new30(); push(goTo(8), node, true); } break;
                    case 31: { Node node = new31(); push(goTo(9), node, true); } break;
                    case 32: { Node node = new32(); push(goTo(10), node, true); } break;
                    case 33: { Node node = new33(); push(goTo(11), node, true); } break;
                    case 34: { Node node = new34(); push(goTo(12), node, true); } break;
                    case 35: { Node node = new35(); push(goTo(12), node, true); } break;
                    case 36: { Node node = new36(); push(goTo(12), node, true); } break;
                    case 37: { Node node = new37(); push(goTo(12), node, true); } break;
                    case 38: { Node node = new38(); push(goTo(13), node, true); } break;
                    case 39: { Node node = new39(); push(goTo(13), node, true); } break;
                    case 40: { Node node = new40(); push(goTo(13), node, true); } break;
                    case 41: { Node node = new41(); push(goTo(13), node, true); } break;
                    case 42: { Node node = new42(); push(goTo(14), node, true); } break;
                    case 43: { Node node = new43(); push(goTo(14), node, true); } break;
                    case 44: { Node node = new44(); push(goTo(22), node, false); } break;
                    case 45: { Node node = new45(); push(goTo(22), node, false); } break;
                    case 46: { Node node = new46(); push(goTo(14), node, true); } break;
                    case 47: { Node node = new47(); push(goTo(15), node, true); } break;
                    }
                    break;
                case ACCEPT:
                    {
                        EOF node2 = (EOF) lexer.next();
                        PProg node1 = (PProg) pop();
                        Start node = new Start(node1, node2);
                        return node;
                    }
                case ERROR:
                    throw new ParserException(last_token,
                        "[" + last_line + "," + last_pos + "] " +
                        errorMessages[errors[action[1]]]);
            }
        }
    }

    Node new0()
    {
        XPClassDecl node1 = null;
        AProg node = new AProg(node1);
        return node;
    }

    Node new1()
    {
        XPClassDecl node1 = (XPClassDecl) pop();
        AProg node = new AProg(node1);
        return node;
    }

    Node new2()
    {
        PClassDecl node2 = (PClassDecl) pop();
        XPClassDecl node1 = (XPClassDecl) pop();
        X1PClassDecl node = new X1PClassDecl(node1, node2);
        return node;
    }

    Node new3()
    {
        PClassDecl node1 = (PClassDecl) pop();
        X2PClassDecl node = new X2PClassDecl(node1);
        return node;
    }

    Node new4()
    {
        TRBrace node9 = (TRBrace) pop();
        XPMethodDecl node8 = null;
        PConstructorDecl node7 = (PConstructorDecl) pop();
        XPFieldDecl node6 = null;
        TLBrace node5 = (TLBrace) pop();
        TIdentifier node4 = (TIdentifier) pop();
        TExtends node3 = (TExtends) pop();
        TIdentifier node2 = (TIdentifier) pop();
        TTclass node1 = (TTclass) pop();
        AClassDecl node = new AClassDecl(node1, node2, node3, node4, node5, node6, node7, node8, node9);
        return node;
    }

    Node new5()
    {
        TRBrace node9 = (TRBrace) pop();
        XPMethodDecl node8 = null;
        PConstructorDecl node7 = (PConstructorDecl) pop();
        XPFieldDecl node6 = (XPFieldDecl) pop();
        TLBrace node5 = (TLBrace) pop();
        TIdentifier node4 = (TIdentifier) pop();
        TExtends node3 = (TExtends) pop();
        TIdentifier node2 = (TIdentifier) pop();
        TTclass node1 = (TTclass) pop();
        AClassDecl node = new AClassDecl(node1, node2, node3, node4, node5, node6, node7, node8, node9);
        return node;
    }

    Node new6()
    {
        PFieldDecl node2 = (PFieldDecl) pop();
        XPFieldDecl node1 = (XPFieldDecl) pop();
        X1PFieldDecl node = new X1PFieldDecl(node1, node2);
        return node;
    }

    Node new7()
    {
        PFieldDecl node1 = (PFieldDecl) pop();
        X2PFieldDecl node = new X2PFieldDecl(node1);
        return node;
    }

    Node new8()
    {
        TRBrace node9 = (TRBrace) pop();
        XPMethodDecl node8 = (XPMethodDecl) pop();
        PConstructorDecl node7 = (PConstructorDecl) pop();
        XPFieldDecl node6 = null;
        TLBrace node5 = (TLBrace) pop();
        TIdentifier node4 = (TIdentifier) pop();
        TExtends node3 = (TExtends) pop();
        TIdentifier node2 = (TIdentifier) pop();
        TTclass node1 = (TTclass) pop();
        AClassDecl node = new AClassDecl(node1, node2, node3, node4, node5, node6, node7, node8, node9);
        return node;
    }

    Node new9()
    {
        PMethodDecl node2 = (PMethodDecl) pop();
        XPMethodDecl node1 = (XPMethodDecl) pop();
        X1PMethodDecl node = new X1PMethodDecl(node1, node2);
        return node;
    }

    Node new10()
    {
        PMethodDecl node1 = (PMethodDecl) pop();
        X2PMethodDecl node = new X2PMethodDecl(node1);
        return node;
    }

    Node new11()
    {
        TRBrace node9 = (TRBrace) pop();
        XPMethodDecl node8 = (XPMethodDecl) pop();
        PConstructorDecl node7 = (PConstructorDecl) pop();
        XPFieldDecl node6 = (XPFieldDecl) pop();
        TLBrace node5 = (TLBrace) pop();
        TIdentifier node4 = (TIdentifier) pop();
        TExtends node3 = (TExtends) pop();
        TIdentifier node2 = (TIdentifier) pop();
        TTclass node1 = (TTclass) pop();
        AClassDecl node = new AClassDecl(node1, node2, node3, node4, node5, node6, node7, node8, node9);
        return node;
    }

    Node new12()
    {
        TSemicolon node3 = (TSemicolon) pop();
        TIdentifier node2 = (TIdentifier) pop();
        TIdentifier node1 = (TIdentifier) pop();
        AFieldDecl node = new AFieldDecl(node1, node2, node3);
        return node;
    }

    Node new13()
    {
        TRBrace node12 = (TRBrace) pop();
        XPThisFieldAssig node11 = null;
        TSemicolon node10 = (TSemicolon) pop();
        TRPar node9 = (TRPar) pop();
        PFieldList node8 = (PFieldList) pop();
        TLPar node7 = (TLPar) pop();
        TSuper node6 = (TSuper) pop();
        TLBrace node5 = (TLBrace) pop();
        TRPar node4 = (TRPar) pop();
        PParamDeclList node3 = (PParamDeclList) pop();
        TLPar node2 = (TLPar) pop();
        TIdentifier node1 = (TIdentifier) pop();
        AConstructorDecl node = new AConstructorDecl(node1, node2, node3, node4, node5, node6, node7, node8, node9, node10, node11, node12);
        return node;
    }

    Node new14()
    {
        TRBrace node12 = (TRBrace) pop();
        XPThisFieldAssig node11 = (XPThisFieldAssig) pop();
        TSemicolon node10 = (TSemicolon) pop();
        TRPar node9 = (TRPar) pop();
        PFieldList node8 = (PFieldList) pop();
        TLPar node7 = (TLPar) pop();
        TSuper node6 = (TSuper) pop();
        TLBrace node5 = (TLBrace) pop();
        TRPar node4 = (TRPar) pop();
        PParamDeclList node3 = (PParamDeclList) pop();
        TLPar node2 = (TLPar) pop();
        TIdentifier node1 = (TIdentifier) pop();
        AConstructorDecl node = new AConstructorDecl(node1, node2, node3, node4, node5, node6, node7, node8, node9, node10, node11, node12);
        return node;
    }

    Node new15()
    {
        PThisFieldAssig node2 = (PThisFieldAssig) pop();
        XPThisFieldAssig node1 = (XPThisFieldAssig) pop();
        X1PThisFieldAssig node = new X1PThisFieldAssig(node1, node2);
        return node;
    }

    Node new16()
    {
        PThisFieldAssig node1 = (PThisFieldAssig) pop();
        X2PThisFieldAssig node = new X2PThisFieldAssig(node1);
        return node;
    }

    Node new17()
    {
        TRBrace node10 = (TRBrace) pop();
        TSemicolon node9 = (TSemicolon) pop();
        PTerm node8 = (PTerm) pop();
        TReturn node7 = (TReturn) pop();
        TLBrace node6 = (TLBrace) pop();
        TRPar node5 = (TRPar) pop();
        PParamDeclList node4 = (PParamDeclList) pop();
        TLPar node3 = (TLPar) pop();
        TIdentifier node2 = (TIdentifier) pop();
        TIdentifier node1 = (TIdentifier) pop();
        AMethodDecl node = new AMethodDecl(node1, node2, node3, node4, node5, node6, node7, node8, node9, node10);
        return node;
    }

    Node new18()
    {
        XPCommaParamArgList node2 = null;
        PParamArg node1 = (PParamArg) pop();
        AParamArgsParamDeclList node = new AParamArgsParamDeclList(node1, node2);
        return node;
    }

    Node new19()
    {
        XPCommaParamArgList node2 = (XPCommaParamArgList) pop();
        PParamArg node1 = (PParamArg) pop();
        AParamArgsParamDeclList node = new AParamArgsParamDeclList(node1, node2);
        return node;
    }

    Node new20()
    {
        PCommaParamArgList node2 = (PCommaParamArgList) pop();
        XPCommaParamArgList node1 = (XPCommaParamArgList) pop();
        X1PCommaParamArgList node = new X1PCommaParamArgList(node1, node2);
        return node;
    }

    Node new21()
    {
        PCommaParamArgList node1 = (PCommaParamArgList) pop();
        X2PCommaParamArgList node = new X2PCommaParamArgList(node1);
        return node;
    }

    Node new22()
    {
        AEmptyParamDeclList node = new AEmptyParamDeclList();
        return node;
    }

    Node new23()
    {
        TIdentifier node2 = (TIdentifier) pop();
        TIdentifier node1 = (TIdentifier) pop();
        AIdentParamArg node = new AIdentParamArg(node1, node2);
        return node;
    }

    Node new24()
    {
        TIdentifier node2 = (TIdentifier) pop();
        TThis node1 = (TThis) pop();
        AThisParamArg node = new AThisParamArg(node1, node2);
        return node;
    }

    Node new25()
    {
        PParamArg node2 = (PParamArg) pop();
        TComma node1 = (TComma) pop();
        ACommaParamArgList node = new ACommaParamArgList(node1, node2);
        return node;
    }

    Node new26()
    {
        XPCommaField node2 = null;
        PFieldName node1 = (PFieldName) pop();
        AFieldListFieldList node = new AFieldListFieldList(node1, node2);
        return node;
    }

    Node new27()
    {
        XPCommaField node2 = (XPCommaField) pop();
        PFieldName node1 = (PFieldName) pop();
        AFieldListFieldList node = new AFieldListFieldList(node1, node2);
        return node;
    }

    Node new28()
    {
        PCommaField node2 = (PCommaField) pop();
        XPCommaField node1 = (XPCommaField) pop();
        X1PCommaField node = new X1PCommaField(node1, node2);
        return node;
    }

    Node new29()
    {
        PCommaField node1 = (PCommaField) pop();
        X2PCommaField node = new X2PCommaField(node1);
        return node;
    }

    Node new30()
    {
        AEmptyFieldList node = new AEmptyFieldList();
        return node;
    }

    Node new31()
    {
        TIdentifier node1 = (TIdentifier) pop();
        AFieldName node = new AFieldName(node1);
        return node;
    }

    Node new32()
    {
        PFieldName node2 = (PFieldName) pop();
        TComma node1 = (TComma) pop();
        ACommaField node = new ACommaField(node1, node2);
        return node;
    }

    Node new33()
    {
        TSemicolon node6 = (TSemicolon) pop();
        TIdentifier node5 = (TIdentifier) pop();
        TEq node4 = (TEq) pop();
        TIdentifier node3 = (TIdentifier) pop();
        TPeriod node2 = (TPeriod) pop();
        TThis node1 = (TThis) pop();
        AThisFieldAssig node = new AThisFieldAssig(node1, node2, node3, node4, node5, node6);
        return node;
    }

    Node new34()
    {
        PNonLeftRecTerm node1 = (PNonLeftRecTerm) pop();
        ANonLeftRecTermTerm node = new ANonLeftRecTermTerm(node1);
        return node;
    }

    Node new35()
    {
        TIdentifier node3 = (TIdentifier) pop();
        TPeriod node2 = (TPeriod) pop();
        PNonLeftRecTerm node1 = (PNonLeftRecTerm) pop();
        AFieldAccessTerm node = new AFieldAccessTerm(node1, node2, node3);
        return node;
    }

    Node new36()
    {
        TRPar node6 = (TRPar) pop();
        PTermList node5 = (PTermList) pop();
        TLPar node4 = (TLPar) pop();
        TIdentifier node3 = (TIdentifier) pop();
        TPeriod node2 = (TPeriod) pop();
        PNonLeftRecTerm node1 = (PNonLeftRecTerm) pop();
        AMethodCallTerm node = new AMethodCallTerm(node1, node2, node3, node4, node5, node6);
        return node;
    }

    Node new37()
    {
        PNonLeftRecTerm node4 = (PNonLeftRecTerm) pop();
        TRSq node3 = (TRSq) pop();
        TIdentifier node2 = (TIdentifier) pop();
        TLSq node1 = (TLSq) pop();
        ACastTerm node = new ACastTerm(node1, node2, node3, node4);
        return node;
    }

    Node new38()
    {
        TIdentifier node1 = (TIdentifier) pop();
        AVariableNonLeftRecTerm node = new AVariableNonLeftRecTerm(node1);
        return node;
    }

    Node new39()
    {
        TThis node1 = (TThis) pop();
        AThisNonLeftRecTerm node = new AThisNonLeftRecTerm(node1);
        return node;
    }

    Node new40()
    {
        TRPar node5 = (TRPar) pop();
        PTermList node4 = (PTermList) pop();
        TLPar node3 = (TLPar) pop();
        TIdentifier node2 = (TIdentifier) pop();
        TNew node1 = (TNew) pop();
        AObjectCreationNonLeftRecTerm node = new AObjectCreationNonLeftRecTerm(node1, node2, node3, node4, node5);
        return node;
    }

    Node new41()
    {
        TRPar node3 = (TRPar) pop();
        PTerm node2 = (PTerm) pop();
        TLPar node1 = (TLPar) pop();
        ABracketNonLeftRecTerm node = new ABracketNonLeftRecTerm(node1, node2, node3);
        return node;
    }

    Node new42()
    {
        XPCommaTerm node2 = null;
        PTerm node1 = (PTerm) pop();
        ATermListTermList node = new ATermListTermList(node1, node2);
        return node;
    }

    Node new43()
    {
        XPCommaTerm node2 = (XPCommaTerm) pop();
        PTerm node1 = (PTerm) pop();
        ATermListTermList node = new ATermListTermList(node1, node2);
        return node;
    }

    Node new44()
    {
        PCommaTerm node2 = (PCommaTerm) pop();
        XPCommaTerm node1 = (XPCommaTerm) pop();
        X1PCommaTerm node = new X1PCommaTerm(node1, node2);
        return node;
    }

    Node new45()
    {
        PCommaTerm node1 = (PCommaTerm) pop();
        X2PCommaTerm node = new X2PCommaTerm(node1);
        return node;
    }

    Node new46()
    {
        AEmptyTermList node = new AEmptyTermList();
        return node;
    }

    Node new47()
    {
        PTerm node2 = (PTerm) pop();
        TComma node1 = (TComma) pop();
        ACommaTerm node = new ACommaTerm(node1, node2);
        return node;
    }

    private static int[][][] actionTable;
/*      {
			{{-1, REDUCE, 0}, {0, SHIFT, 1}, },
			{{-1, ERROR, 1}, {16, SHIFT, 5}, },
			{{-1, ERROR, 2}, {17, ACCEPT, -1}, },
			{{-1, REDUCE, 3}, },
			{{-1, REDUCE, 1}, {0, SHIFT, 1}, },
			{{-1, ERROR, 5}, {1, SHIFT, 7}, },
			{{-1, REDUCE, 2}, },
			{{-1, ERROR, 7}, {16, SHIFT, 8}, },
			{{-1, ERROR, 8}, {6, SHIFT, 9}, },
			{{-1, ERROR, 9}, {16, SHIFT, 10}, },
			{{-1, ERROR, 10}, {10, SHIFT, 14}, {16, SHIFT, 15}, },
			{{-1, REDUCE, 7}, },
			{{-1, ERROR, 12}, {7, SHIFT, 16}, {16, SHIFT, 17}, },
			{{-1, ERROR, 13}, {16, SHIFT, 10}, },
			{{-1, REDUCE, 22}, {3, SHIFT, 22}, {16, SHIFT, 23}, },
			{{-1, ERROR, 15}, {8, SHIFT, 26}, },
			{{-1, REDUCE, 4}, },
			{{-1, ERROR, 17}, {16, SHIFT, 27}, },
			{{-1, REDUCE, 10}, },
			{{-1, ERROR, 19}, {7, SHIFT, 28}, {16, SHIFT, 17}, },
			{{-1, REDUCE, 6}, },
			{{-1, ERROR, 21}, {7, SHIFT, 30}, {16, SHIFT, 17}, },
			{{-1, ERROR, 22}, {16, SHIFT, 32}, },
			{{-1, ERROR, 23}, {16, SHIFT, 33}, },
			{{-1, ERROR, 24}, {11, SHIFT, 34}, },
			{{-1, REDUCE, 18}, {9, SHIFT, 35}, },
			{{-1, REDUCE, 12}, },
			{{-1, ERROR, 27}, {10, SHIFT, 38}, },
			{{-1, REDUCE, 8}, },
			{{-1, REDUCE, 9}, },
			{{-1, REDUCE, 5}, },
			{{-1, ERROR, 31}, {7, SHIFT, 39}, {16, SHIFT, 17}, },
			{{-1, REDUCE, 24}, },
			{{-1, REDUCE, 23}, },
			{{-1, ERROR, 34}, {6, SHIFT, 40}, },
			{{-1, ERROR, 35}, {3, SHIFT, 22}, {16, SHIFT, 23}, },
			{{-1, REDUCE, 21}, },
			{{-1, REDUCE, 19}, {9, SHIFT, 35}, },
			{{-1, REDUCE, 22}, {3, SHIFT, 22}, {16, SHIFT, 23}, },
			{{-1, REDUCE, 11}, },
			{{-1, ERROR, 40}, {2, SHIFT, 44}, },
			{{-1, REDUCE, 25}, },
			{{-1, REDUCE, 20}, },
			{{-1, ERROR, 43}, {11, SHIFT, 45}, },
			{{-1, ERROR, 44}, {10, SHIFT, 46}, },
			{{-1, ERROR, 45}, {6, SHIFT, 47}, },
			{{-1, REDUCE, 30}, {16, SHIFT, 48}, },
			{{-1, ERROR, 47}, {5, SHIFT, 51}, },
			{{-1, REDUCE, 31}, },
			{{-1, ERROR, 49}, {11, SHIFT, 52}, },
			{{-1, REDUCE, 26}, {9, SHIFT, 53}, },
			{{-1, ERROR, 51}, {3, SHIFT, 56}, {4, SHIFT, 57}, {10, SHIFT, 58}, {12, SHIFT, 59}, {16, SHIFT, 60}, },
			{{-1, ERROR, 52}, {8, SHIFT, 63}, },
			{{-1, ERROR, 53}, {16, SHIFT, 48}, },
			{{-1, REDUCE, 29}, },
			{{-1, REDUCE, 27}, {9, SHIFT, 53}, },
			{{-1, REDUCE, 39}, },
			{{-1, ERROR, 57}, {16, SHIFT, 66}, },
			{{-1, ERROR, 58}, {3, SHIFT, 56}, {4, SHIFT, 57}, {10, SHIFT, 58}, {12, SHIFT, 59}, {16, SHIFT, 60}, },
			{{-1, ERROR, 59}, {16, SHIFT, 68}, },
			{{-1, REDUCE, 38}, },
			{{-1, ERROR, 61}, {8, SHIFT, 69}, },
			{{-1, REDUCE, 34}, {14, SHIFT, 70}, },
			{{-1, ERROR, 63}, {3, SHIFT, 71}, {7, SHIFT, 72}, },
			{{-1, REDUCE, 32}, },
			{{-1, REDUCE, 28}, },
			{{-1, ERROR, 66}, {10, SHIFT, 75}, },
			{{-1, ERROR, 67}, {11, SHIFT, 76}, },
			{{-1, ERROR, 68}, {13, SHIFT, 77}, },
			{{-1, ERROR, 69}, {7, SHIFT, 78}, },
			{{-1, ERROR, 70}, {16, SHIFT, 79}, },
			{{-1, ERROR, 71}, {14, SHIFT, 80}, },
			{{-1, REDUCE, 13}, },
			{{-1, REDUCE, 16}, },
			{{-1, ERROR, 74}, {3, SHIFT, 71}, {7, SHIFT, 81}, },
			{{-1, REDUCE, 46}, {3, SHIFT, 56}, {4, SHIFT, 57}, {10, SHIFT, 58}, {12, SHIFT, 59}, {16, SHIFT, 60}, },
			{{-1, REDUCE, 41}, },
			{{-1, ERROR, 77}, {3, SHIFT, 56}, {4, SHIFT, 57}, {10, SHIFT, 58}, {16, SHIFT, 60}, },
			{{-1, REDUCE, 17}, },
			{{-1, REDUCE, 35}, {10, SHIFT, 86}, },
			{{-1, ERROR, 80}, {16, SHIFT, 87}, },
			{{-1, REDUCE, 14}, },
			{{-1, REDUCE, 15}, },
			{{-1, REDUCE, 42}, {9, SHIFT, 88}, },
			{{-1, ERROR, 84}, {11, SHIFT, 91}, },
			{{-1, REDUCE, 37}, },
			{{-1, REDUCE, 46}, {3, SHIFT, 56}, {4, SHIFT, 57}, {10, SHIFT, 58}, {12, SHIFT, 59}, {16, SHIFT, 60}, },
			{{-1, ERROR, 87}, {15, SHIFT, 93}, },
			{{-1, ERROR, 88}, {3, SHIFT, 56}, {4, SHIFT, 57}, {10, SHIFT, 58}, {12, SHIFT, 59}, {16, SHIFT, 60}, },
			{{-1, REDUCE, 45}, },
			{{-1, REDUCE, 43}, {9, SHIFT, 88}, },
			{{-1, REDUCE, 40}, },
			{{-1, ERROR, 92}, {11, SHIFT, 96}, },
			{{-1, ERROR, 93}, {16, SHIFT, 97}, },
			{{-1, REDUCE, 47}, },
			{{-1, REDUCE, 44}, },
			{{-1, REDUCE, 36}, },
			{{-1, ERROR, 97}, {8, SHIFT, 98}, },
			{{-1, REDUCE, 33}, },
        };*/
    private static int[][][] gotoTable;
/*      {
			{{-1, 2}, },
			{{-1, 3}, {4, 6}, },
			{{-1, 11}, {13, 20}, },
			{{-1, 12}, {13, 21}, },
			{{-1, 18}, {19, 29}, {31, 29}, },
			{{-1, 24}, {38, 43}, },
			{{-1, 25}, {35, 41}, },
			{{-1, 36}, {37, 42}, },
			{{-1, 49}, },
			{{-1, 50}, {53, 64}, },
			{{-1, 54}, {55, 65}, },
			{{-1, 73}, {74, 82}, },
			{{-1, 83}, {51, 61}, {58, 67}, {88, 94}, },
			{{-1, 62}, {77, 85}, },
			{{-1, 84}, {86, 92}, },
			{{-1, 89}, {90, 95}, },
			{{-1, 4}, },
			{{-1, 13}, },
			{{-1, 19}, {21, 31}, },
			{{-1, 74}, },
			{{-1, 37}, },
			{{-1, 55}, },
			{{-1, 90}, },
        };*/
    private static String[] errorMessages;
/*      {
			"expecting: 'class', EOF",
			"expecting: identifier",
			"expecting: EOF",
			"expecting: 'extends'",
			"expecting: '{'",
			"expecting: '(', identifier",
			"expecting: '}', identifier",
			"expecting: 'this', ')', identifier",
			"expecting: ';'",
			"expecting: ')'",
			"expecting: ',', ')'",
			"expecting: '('",
			"expecting: 'this', identifier",
			"expecting: 'super'",
			"expecting: ')', identifier",
			"expecting: 'return'",
			"expecting: 'this', 'new', '(', '[', identifier",
			"expecting: ';', ',', ')', '.'",
			"expecting: 'this', '}'",
			"expecting: ']'",
			"expecting: '}'",
			"expecting: '.'",
			"expecting: 'this', 'new', '(', ')', '[', identifier",
			"expecting: 'this', 'new', '(', identifier",
			"expecting: ';', ',', '(', ')'",
			"expecting: ';', ',', ')'",
			"expecting: '='",
        };*/
    private static int[] errors;
/*      {
			0, 1, 2, 0, 0, 3, 0, 1, 4, 1, 5, 1, 6, 1, 7, 8, 0, 1, 6, 6, 1, 6, 1, 1, 9, 10, 1, 11, 0, 6, 0, 6, 10, 10, 4, 12, 10, 10, 7, 0, 13, 10, 10, 9, 11, 4, 14, 15, 10, 9, 10, 16, 8, 1, 10, 10, 17, 1, 16, 1, 17, 8, 17, 18, 10, 10, 11, 9, 19, 20, 1, 21, 6, 18, 18, 22, 17, 23, 6, 24, 1, 6, 18, 10, 9, 25, 22, 26, 16, 10, 10, 17, 9, 1, 10, 10, 25, 8, 18, 
        };*/
}
