package org.eclipse.jdt.internal.compiler.parser;
import java.io.*;
import org.eclipse.jdt.core.compiler.CharOperation;
import org.eclipse.jdt.core.compiler.InvalidInputException;
import org.eclipse.jdt.internal.compiler.CompilationResult;
import org.eclipse.jdt.internal.compiler.ast.*;
import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
import org.eclipse.jdt.internal.compiler.lookup.BindingIds;
import org.eclipse.jdt.internal.compiler.lookup.CompilerModifiers;
import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
import org.eclipse.jdt.internal.compiler.parser.diagnose.DiagnoseParser;
import org.eclipse.jdt.internal.compiler.problem.AbortCompilation;
import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
import org.eclipse.jdt.internal.compiler.util.Util;
public class Parser
        implements
            BindingIds,
            ParserBasicInformation,
            TerminalTokens,
            CompilerModifiers,
            OperatorIds,
            TypeIds {
    protected ProblemReporter problemReporter;
    public int firstToken; // handle for multiple parsing goals
    public int lastAct; //handle for multiple parsing goals
    protected ReferenceContext referenceContext;
    public int currentToken;
    private int synchronizedBlockSourceStart;
    //error recovery management
    protected int lastCheckPoint;
    protected RecoveredElement currentElement;
    public static boolean VERBOSE_RECOVERY = false;
    protected boolean restartRecovery;
    protected int listLength; // for recovering some incomplete list (interfaces, throws or parameters)
    protected boolean hasError;
    protected boolean hasReportedError;
    public static boolean fineErrorDiagnose = true; //TODO remove the static modifier when new diagnose is ready
    public boolean reportSyntaxErrorIsRequired = true;
    public boolean reportOnlyOneSyntaxError = false;
    protected int recoveredStaticInitializerStart;
    protected int lastIgnoredToken, nextIgnoredToken;
    protected int lastErrorEndPosition;
    protected boolean ignoreNextOpeningBrace;
    // assert is 1.4 feature only
    protected long sourceLevel;
    //internal data for the automat 
    protected final static int StackIncrement = 255;
    protected int stateStackTop;
    protected int[] stack = new int[StackIncrement];
    //scanner token 
    public Scanner scanner;
    //ast stack
    final static int AstStackIncrement = 100;
    protected int astPtr;
    protected AstNode[] astStack = new AstNode[AstStackIncrement];
    protected int astLengthPtr;
    protected int[] astLengthStack;
    public CompilationUnitDeclaration compilationUnit; /*the result from parse()*/
    AstNode[] noAstNodes = new AstNode[AstStackIncrement];
    //expression stack
    final static int ExpressionStackIncrement = 100;
    protected int expressionPtr;
    protected Expression[] expressionStack = new Expression[ExpressionStackIncrement];
    protected int expressionLengthPtr;
    protected int[] expressionLengthStack;
    Expression[] noExpressions = new Expression[ExpressionStackIncrement];
    //identifiers stacks 
    protected int identifierPtr;
    protected char[][] identifierStack;
    protected int identifierLengthPtr;
    protected int[] identifierLengthStack;
    protected long[] identifierPositionStack;
    //positions , dimensions , .... (what ever is int) ..... stack
    protected int intPtr;
    protected int[] intStack;
    protected int endPosition; //accurate only when used ! (the start position is pushed into intStack while the end the current one)
    protected int endStatementPosition;
    protected int lParenPos, rParenPos; //accurate only when used !
    //modifiers dimensions nestedType etc.......
    protected boolean optimizeStringLiterals = true;
    protected int modifiers;
    protected int modifiersSourceStart;
    protected int nestedType, dimensions;
    protected int[] nestedMethod; //the ptr is nestedType
    protected int[] realBlockStack;
    protected int realBlockPtr;
    protected boolean diet = false; //tells the scanner to jump over some parts of the code/expressions like method bodies
    protected int dietInt = 0; // if > 0 force the none-diet-parsing mode (even if diet if requested) [field parsing with anonymous inner classes...]
    protected int[] variablesCounter;
    public void foo() {
        byte rhs[] = {0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 3, 4, 0, 1, 2, 1, 1, 1, 1,
                1, 1, 1, 1, 1, 1, 5, 1, 2, 1, 2, 2, 2, 1, 1, 2, 2, 2, 4, 1, 1,
                1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 3, 2, 2, 1, 3,
                1, 3, 1, 2, 1, 1, 1, 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, 4, 1, 3, 3,
                7, 0, 0, 0, 0, 0, 2, 1, 1, 1, 2, 2, 4, 4, 5, 4, 4, 2, 1, 2, 3,
                3, 1, 3, 3, 1, 3, 1, 4, 0, 2, 1, 2, 2, 4, 1, 1, 2, 5, 5, 7, 7,
                7, 7, 2, 2, 3, 2, 2, 3, 1, 2, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1,
                3, 3, 4, 1, 3, 4, 0, 1, 2, 1, 1, 1, 1, 2, 3, 4, 0, 1, 1, 1, 1,
                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                3, 2, 1, 1, 1, 1, 1, 1, 1, 5, 7, 7, 6, 2, 3, 3, 4, 1, 2, 2, 1,
                2, 3, 2, 5, 5, 7, 9, 9, 1, 1, 1, 1, 3, 3, 5, 2, 3, 2, 3, 3, 3,
                5, 1, 3, 4, 1, 2, 5, 2, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 3, 3,
                3, 3, 1, 1, 5, 6, 8, 7, 2, 0, 2, 0, 1, 3, 3, 3, 3, 4, 3, 4, 1,
                2, 3, 2, 1, 1, 2, 2, 3, 3, 4, 6, 6, 4, 4, 4, 1, 1, 1, 1, 2, 2,
                0, 1, 1, 3, 3, 1, 3, 3, 1, 3, 3, 1, 6, 6, 5, 0, 0, 1, 3, 3, 3,
                1, 3, 3, 1, 3, 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, 1, 3, 1, 3, 1,
                3, 1, 3, 1, 3, 1, 5, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 0, 1,
                0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 0, 0, 1, 0, 1, 0, 1,
                0, 1};
    }
}