package org.eclipse.wst.jsdt.internal.compiler.parser;



import java.io.*;

import org.eclipse.wst.jsdt.core.compiler.CharOperation;
import org.eclipse.wst.jsdt.core.compiler.InvalidInputException;
import org.eclipse.wst.jsdt.internal.compiler.CompilationResult;
import org.eclipse.wst.jsdt.internal.compiler.ast.*;
import org.eclipse.wst.jsdt.internal.compiler.env.ICompilationUnit;
import org.eclipse.wst.jsdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.wst.jsdt.internal.compiler.impl.ReferenceContext;
import org.eclipse.wst.jsdt.internal.compiler.lookup.BindingIds;
import org.eclipse.wst.jsdt.internal.compiler.lookup.CompilerModifiers;
import org.eclipse.wst.jsdt.internal.compiler.lookup.TypeIds;
import org.eclipse.wst.jsdt.internal.compiler.parser.diagnose.DiagnoseParser;
import org.eclipse.wst.jsdt.internal.compiler.problem.AbortCompilation;
import org.eclipse.wst.jsdt.internal.compiler.problem.ProblemReporter;
import org.eclipse.wst.jsdt.internal.compiler.problem.ProblemSeverities;
import org.eclipse.wst.jsdt.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
        };
    }
}