Config editor through XML file
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / parser / Parser.java
index d46b0a2..299d267 100644 (file)
@@ -13,9 +13,9 @@ package net.sourceforge.phpdt.internal.compiler.parser;
 import net.sourceforge.phpdt.core.compiler.*;
 import net.sourceforge.phpdt.core.compiler.InvalidInputException;
 import net.sourceforge.phpdt.internal.compiler.*;
-import net.sourceforge.phpdt.internal.compiler.env.*; 
+import net.sourceforge.phpdt.internal.compiler.env.*;
 import net.sourceforge.phpdt.internal.compiler.impl.*;
-import net.sourceforge.phpdt.internal.compiler.ast.*; 
+import net.sourceforge.phpdt.internal.compiler.ast.*;
 import net.sourceforge.phpdt.internal.compiler.lookup.*;
 import net.sourceforge.phpdt.internal.compiler.problem.*;
 import net.sourceforge.phpdt.internal.compiler.util.*;
@@ -24,7430 +24,7531 @@ import java.io.*;
 import java.util.ArrayList;
 
 public class Parser implements BindingIds, ParserBasicInformation, ITerminalSymbols, 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 hasReportedError;
-       protected int recoveredStaticInitializerStart;
-       protected int lastIgnoredToken, nextIgnoredToken;
-       protected int lastErrorEndPosition;
-               
-       // 1.4 feature
-       protected boolean assertMode = false;
-       
-       //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;
-       //===DATA===DATA===DATA===DATA===DATA===DATA===//
-    public final static 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,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,3,1,
-            1,3,3,3,3,3,1,1,5,6,8,7,2,0,2,
-            0,1,3,4,4,1,2,3,2,1,1,2,2,3,3,
-            4,6,6,4,4,1,1,1,1,2,2,0,1,1,3,
-            3,1,3,3,1,3,3,1,5,5,4,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,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,0,
-            1
+  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 hasReportedError;
+  protected int recoveredStaticInitializerStart;
+  protected int lastIgnoredToken, nextIgnoredToken;
+  protected int lastErrorEndPosition;
+
+  // 1.4 feature
+  protected boolean assertMode = false;
+
+  //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;
+  //===DATA===DATA===DATA===DATA===DATA===DATA===//
+  public final static 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,
+      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,
+      3,
+      1,
+      1,
+      3,
+      3,
+      3,
+      3,
+      3,
+      1,
+      1,
+      5,
+      6,
+      8,
+      7,
+      2,
+      0,
+      2,
+      0,
+      1,
+      3,
+      4,
+      4,
+      1,
+      2,
+      3,
+      2,
+      1,
+      1,
+      2,
+      2,
+      3,
+      3,
+      4,
+      6,
+      6,
+      4,
+      4,
+      1,
+      1,
+      1,
+      1,
+      2,
+      2,
+      0,
+      1,
+      1,
+      3,
+      3,
+      1,
+      3,
+      3,
+      1,
+      3,
+      3,
+      1,
+      5,
+      5,
+      4,
+      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,
+      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,
+      0,
+      1 };
+
+  public static char asb[] = null;
+  public static char asr[] = null;
+  public static char symbol_index[] = null;
+  private static final String UNEXPECTED_EOF = "Unexpected End Of File"; //$NON-NLS-1$
+
+  public final static String name[] = { null, "++",
+    //$NON-NLS-1$
+    "--", //$NON-NLS-1$
+    "==", //$NON-NLS-1$
+    "<=", //$NON-NLS-1$
+    ">=", //$NON-NLS-1$
+    "!=", //$NON-NLS-1$
+    "<<", //$NON-NLS-1$
+    ">>", //$NON-NLS-1$
+    ">>>", //$NON-NLS-1$
+    "+=", //$NON-NLS-1$
+    "-=", //$NON-NLS-1$
+    "*=", //$NON-NLS-1$
+    "/=", //$NON-NLS-1$
+    "&=", //$NON-NLS-1$
+    "|=", //$NON-NLS-1$
+    "^=", //$NON-NLS-1$
+    "%=", //$NON-NLS-1$
+    "<<=", //$NON-NLS-1$
+    ">>=", //$NON-NLS-1$
+    ">>>=", //$NON-NLS-1$
+    "||", //$NON-NLS-1$
+    "&&", //$NON-NLS-1$
+    "+", //$NON-NLS-1$
+    "-", //$NON-NLS-1$
+    "!", //$NON-NLS-1$
+    "%", //$NON-NLS-1$
+    "^", //$NON-NLS-1$
+    "&", //$NON-NLS-1$
+    "*", //$NON-NLS-1$
+    "|", //$NON-NLS-1$
+    "~", //$NON-NLS-1$
+    "/", //$NON-NLS-1$
+    ">", //$NON-NLS-1$
+    "<", //$NON-NLS-1$
+    "(", //$NON-NLS-1$
+    ")", //$NON-NLS-1$
+    "{", //$NON-NLS-1$
+    "}", //$NON-NLS-1$
+    "[", //$NON-NLS-1$
+    "]", //$NON-NLS-1$
+    ";", //$NON-NLS-1$
+    "?", //$NON-NLS-1$
+    ":", //$NON-NLS-1$
+    ",", //$NON-NLS-1$
+    ".", //$NON-NLS-1$
+    "=", //$NON-NLS-1$
+    "", //$NON-NLS-1$
+    "$empty", //$NON-NLS-1$
+    "Identifier", //$NON-NLS-1$
+    "abstract", //$NON-NLS-1$
+    "assert", //$NON-NLS-1$
+    "boolean", //$NON-NLS-1$
+    "break", //$NON-NLS-1$
+    "byte", //$NON-NLS-1$
+    "case", //$NON-NLS-1$
+    "catch", //$NON-NLS-1$
+    "char", //$NON-NLS-1$
+    "class", //$NON-NLS-1$
+    "continue", //$NON-NLS-1$
+    "default", //$NON-NLS-1$
+    "do", //$NON-NLS-1$
+    "double", //$NON-NLS-1$
+    "else", //$NON-NLS-1$
+    "extends", //$NON-NLS-1$
+    "false", //$NON-NLS-1$
+    "final", //$NON-NLS-1$
+    "finally", //$NON-NLS-1$
+    "float", //$NON-NLS-1$
+    "for", //$NON-NLS-1$
+    "if", //$NON-NLS-1$
+    "implements", //$NON-NLS-1$
+    "import", //$NON-NLS-1$
+    "instanceof", //$NON-NLS-1$
+    "int", //$NON-NLS-1$
+    "interface", //$NON-NLS-1$
+    "long", //$NON-NLS-1$
+    "native", //$NON-NLS-1$
+    "new", //$NON-NLS-1$
+    "null", //$NON-NLS-1$
+    "package", //$NON-NLS-1$
+    "private", //$NON-NLS-1$
+    "protected", //$NON-NLS-1$
+    "public", //$NON-NLS-1$
+    "return", //$NON-NLS-1$
+    "short", //$NON-NLS-1$
+    "static", //$NON-NLS-1$
+    "strictfp", //$NON-NLS-1$
+    "super", //$NON-NLS-1$
+    "switch", //$NON-NLS-1$
+    "synchronized", //$NON-NLS-1$
+    "this", //$NON-NLS-1$
+    "throw", //$NON-NLS-1$
+    "throws", //$NON-NLS-1$
+    "transient", //$NON-NLS-1$
+    "true", //$NON-NLS-1$
+    "try", //$NON-NLS-1$
+    "void", //$NON-NLS-1$
+    "volatile", //$NON-NLS-1$
+    "while", //$NON-NLS-1$
+    "IntegerLiteral", //$NON-NLS-1$
+    "LongLiteral", //$NON-NLS-1$
+    "FloatingPointLiteral", //$NON-NLS-1$
+    "DoubleLiteral", //$NON-NLS-1$
+    "CharacterLiteral", //$NON-NLS-1$
+    "StringLiteral", //$NON-NLS-1$
+    UNEXPECTED_EOF, "Invalid Character",
+    //$NON-NLS-1$            
+    "Goal", //$NON-NLS-1$
+    "MethodBody", //$NON-NLS-1$
+    "ConstructorBody", //$NON-NLS-1$
+    "StaticInitializer", //$NON-NLS-1$
+    "Initializer", //$NON-NLS-1$
+    "Headers", //$NON-NLS-1$
+    "BlockStatements", //$NON-NLS-1$
+    "MethodPushModifiersHeader", //$NON-NLS-1$
+    "CatchHeader", //$NON-NLS-1$
+    "FieldDeclaration", //$NON-NLS-1$
+    "ImportDeclaration", //$NON-NLS-1$
+    "PackageDeclaration", //$NON-NLS-1$
+    "TypeDeclaration", //$NON-NLS-1$
+    "GenericMethodDeclaration", //$NON-NLS-1$
+    "ClassBodyDeclaration", //$NON-NLS-1$
+    "Expression", //$NON-NLS-1$
+    "Type", //$NON-NLS-1$
+    "PrimitiveType", //$NON-NLS-1$
+    "ReferenceType", //$NON-NLS-1$
+    "ClassOrInterfaceType", //$NON-NLS-1$
+    "ArrayType", //$NON-NLS-1$
+    "Name", //$NON-NLS-1$
+    "Dims", //$NON-NLS-1$
+    "ClassType", //$NON-NLS-1$
+    "SimpleName", //$NON-NLS-1$
+    "Header", //$NON-NLS-1$
+    "ClassHeader", //$NON-NLS-1$
+    "InterfaceHeader", //$NON-NLS-1$
+    "MethodHeader", //$NON-NLS-1$
+    "ConstructorHeader", //$NON-NLS-1$
+    "FormalParameter", //$NON-NLS-1$
+    "ImportDeclarations", //$NON-NLS-1$
+    "TypeDeclarations", //$NON-NLS-1$
+    "PackageDeclarationName", //$NON-NLS-1$
+    "SingleTypeImportDeclarationName", //$NON-NLS-1$
+    "TypeImportOnDemandDeclarationName", //$NON-NLS-1$
+    "Modifiers", //$NON-NLS-1$
+    "Modifier", //$NON-NLS-1$
+    "ClassBody", //$NON-NLS-1$
+    "ClassHeaderName", //$NON-NLS-1$
+    "InterfaceTypeList", //$NON-NLS-1$
+    "InterfaceType", //$NON-NLS-1$
+    "ClassBodyDeclarations", //$NON-NLS-1$
+    "Block", //$NON-NLS-1$
+    "VariableDeclarators", //$NON-NLS-1$
+    "VariableDeclarator", //$NON-NLS-1$
+    "VariableDeclaratorId", //$NON-NLS-1$
+    "VariableInitializer", //$NON-NLS-1$
+    "ArrayInitializer", //$NON-NLS-1$
+    "MethodHeaderName", //$NON-NLS-1$
+    "MethodHeaderParameters", //$NON-NLS-1$
+    "MethodPushModifiersHeaderName", //$NON-NLS-1$
+    "ClassTypeList", //$NON-NLS-1$
+    "ConstructorHeaderName", //$NON-NLS-1$
+    "FormalParameterList", //$NON-NLS-1$
+    "ClassTypeElt", //$NON-NLS-1$
+    "StaticOnly", //$NON-NLS-1$
+    "ExplicitConstructorInvocation", //$NON-NLS-1$
+    "Primary", //$NON-NLS-1$
+    "InterfaceBody", //$NON-NLS-1$
+    "InterfaceHeaderName", //$NON-NLS-1$
+    "InterfaceMemberDeclarations", //$NON-NLS-1$
+    "InterfaceMemberDeclaration", //$NON-NLS-1$
+    "VariableInitializers", //$NON-NLS-1$
+    "BlockStatement", //$NON-NLS-1$
+    "Statement", //$NON-NLS-1$
+    "LocalVariableDeclaration", //$NON-NLS-1$
+    "StatementWithoutTrailingSubstatement", //$NON-NLS-1$
+    "StatementNoShortIf", //$NON-NLS-1$
+    "StatementExpression", //$NON-NLS-1$
+    "PostIncrementExpression", //$NON-NLS-1$
+    "PostDecrementExpression", //$NON-NLS-1$
+    "MethodInvocation", //$NON-NLS-1$
+    "ClassInstanceCreationExpression", //$NON-NLS-1$
+    "SwitchBlock", //$NON-NLS-1$
+    "SwitchBlockStatements", //$NON-NLS-1$
+    "SwitchLabels", //$NON-NLS-1$
+    "SwitchBlockStatement", //$NON-NLS-1$
+    "SwitchLabel", //$NON-NLS-1$
+    "ConstantExpression", //$NON-NLS-1$
+    "StatementExpressionList", //$NON-NLS-1$
+    "OnlySynchronized", //$NON-NLS-1$
+    "Catches", //$NON-NLS-1$
+    "Finally", //$NON-NLS-1$
+    "CatchClause", //$NON-NLS-1$
+    "PushLPAREN", //$NON-NLS-1$
+    "PushRPAREN", //$NON-NLS-1$
+    "PrimaryNoNewArray", //$NON-NLS-1$
+    "FieldAccess", //$NON-NLS-1$
+    "ArrayAccess", //$NON-NLS-1$
+    "ClassInstanceCreationExpressionName", //$NON-NLS-1$
+    "ArgumentList", //$NON-NLS-1$
+    "DimWithOrWithOutExprs", //$NON-NLS-1$
+    "DimWithOrWithOutExpr", //$NON-NLS-1$
+    "DimsLoop", //$NON-NLS-1$
+    "OneDimLoop", //$NON-NLS-1$
+    "PostfixExpression", //$NON-NLS-1$
+    "UnaryExpression", //$NON-NLS-1$
+    "UnaryExpressionNotPlusMinus", //$NON-NLS-1$
+    "MultiplicativeExpression", //$NON-NLS-1$
+    "AdditiveExpression", //$NON-NLS-1$
+    "ShiftExpression", //$NON-NLS-1$
+    "RelationalExpression", //$NON-NLS-1$
+    "EqualityExpression", //$NON-NLS-1$
+    "AndExpression", //$NON-NLS-1$
+    "ExclusiveOrExpression", //$NON-NLS-1$
+    "InclusiveOrExpression", //$NON-NLS-1$
+    "ConditionalAndExpression", //$NON-NLS-1$
+    "ConditionalOrExpression", //$NON-NLS-1$
+    "ConditionalExpression", //$NON-NLS-1$
+    "AssignmentExpression", //$NON-NLS-1$
+    "LeftHandSide", //$NON-NLS-1$
+    "AssignmentOperator" //$NON-NLS-1$
+  };
+
+  public static short check_table[] = null;
+  public static char lhs[] = null;
+  public static char action[] = lhs;
+  private final static String FILEPREFIX = "parser"; //$NON-NLS-1$
+
+  static {
+    try {
+      initTables();
+    } catch (java.io.IOException ex) {
+      throw new ExceptionInInitializerError(ex.getMessage());
+    }
+  }
+
+  public static final int RoundBracket = 0;
+  public static final int SquareBracket = 1;
+  public static final int CurlyBracket = 2;
+  public static final int BracketKinds = 3;
+
+  public Parser(ProblemReporter problemReporter, boolean optimizeStringLiterals, boolean assertMode) {
+
+    this.problemReporter = problemReporter;
+    this.optimizeStringLiterals = optimizeStringLiterals;
+    this.assertMode = assertMode;
+    this.initializeScanner();
+    astLengthStack = new int[50];
+    expressionLengthStack = new int[30];
+    intStack = new int[50];
+    identifierStack = new char[30][];
+    identifierLengthStack = new int[30];
+    nestedMethod = new int[30];
+    realBlockStack = new int[30];
+    identifierPositionStack = new long[30];
+    variablesCounter = new int[30];
+  }
+  /**
+   *
+   * INTERNAL USE-ONLY
+   */
+  protected void adjustInterfaceModifiers() {
+    intStack[intPtr - 1] |= AccInterface;
+  }
+  public final void arrayInitializer(int length) {
+    //length is the size of the array Initializer
+    //expressionPtr points on the last elt of the arrayInitializer
+    //i.e. it has not been decremented yet.
+
+    ArrayInitializer ai = new ArrayInitializer();
+    if (length != 0) {
+      expressionPtr -= length;
+      System.arraycopy(expressionStack, expressionPtr + 1, ai.expressions = new Expression[length], 0, length);
+    }
+    pushOnExpressionStack(ai);
+    //positionning
+    ai.sourceEnd = endStatementPosition;
+    int searchPosition = length == 0 ? endPosition : ai.expressions[0].sourceStart;
+    try {
+      //does not work with comments(that contain '{') nor '{' describes as a unicode....               
+      while (scanner.source[--searchPosition] != '{') {
+      }
+    } catch (IndexOutOfBoundsException ex) {
+      //should never occur (except for strange cases like whose describe above)
+      searchPosition = (length == 0 ? endPosition : ai.expressions[0].sourceStart) - 1;
+    }
+    ai.sourceStart = searchPosition;
+  }
+  protected static int asi(int state) {
+
+    return asb[original_state(state)];
+  }
+  protected void blockReal() {
+    // See consumeLocalVariableDeclarationStatement in case of change: duplicated code
+    // increment the amount of declared variables for this block
+    realBlockStack[realBlockPtr]++;
+  }
+  private final static void buildFileFor(String filename, String tag, String[] tokens, boolean isShort)
+    throws java.io.IOException {
+
+    //transform the String tokens into chars before dumping then into file
+
+    int i = 0;
+    //read upto the tag
+    while (!tokens[i++].equals(tag)) {
+    }
+    //read upto the }
+    char[] chars = new char[tokens.length]; //can't be bigger
+    int ic = 0;
+    String token;
+    while (!(token = tokens[i++]).equals("}")) { //$NON-NLS-1$
+      int c = Integer.parseInt(token);
+      if (isShort)
+        c += 32768;
+      chars[ic++] = (char) c;
+    }
+
+    //resize
+    System.arraycopy(chars, 0, chars = new char[ic], 0, ic);
+
+    buildFileForTable(filename, chars);
+  }
+  private final static void buildFileForTable(String filename, char[] chars) throws java.io.IOException {
+
+    byte[] bytes = new byte[chars.length * 2];
+    for (int i = 0; i < chars.length; i++) {
+      bytes[2 * i] = (byte) (chars[i] >>> 8);
+      bytes[2 * i + 1] = (byte) (chars[i] & 0xFF);
+    }
+
+    java.io.FileOutputStream stream = new java.io.FileOutputStream(filename);
+    stream.write(bytes);
+    stream.close();
+    System.out.println(filename + " creation complete"); //$NON-NLS-1$
+  }
+  public final static void buildFilesFromLPG(String dataFilename) throws java.io.IOException {
+
+    //RUN THIS METHOD TO GENERATE PARSER*.RSC FILES
+
+    //build from the lpg javadcl.java files that represents the parser tables
+    //lhs check_table asb asr symbol_index
+
+    //[org.eclipse.jdt.internal.compiler.parser.Parser.buildFilesFromLPG("d:/leapfrog/grammar/javadcl.java")]
+
+    char[] contents = new char[] {
     };
-
-               
-       public  static char asb[] = null;
-       public  static char asr[] = null;
-       public  static char symbol_index[] = null;
-       private static final String UNEXPECTED_EOF = "Unexpected End Of File" ; //$NON-NLS-1$
-
-       public final static String name[] = { null,
-            "++",//$NON-NLS-1$
-            "--",//$NON-NLS-1$
-            "==",//$NON-NLS-1$
-            "<=",//$NON-NLS-1$
-            ">=",//$NON-NLS-1$
-            "!=",//$NON-NLS-1$
-            "<<",//$NON-NLS-1$
-            ">>",//$NON-NLS-1$
-            ">>>",//$NON-NLS-1$
-            "+=",//$NON-NLS-1$
-            "-=",//$NON-NLS-1$
-            "*=",//$NON-NLS-1$
-            "/=",//$NON-NLS-1$
-            "&=",//$NON-NLS-1$
-            "|=",//$NON-NLS-1$
-            "^=",//$NON-NLS-1$
-            "%=",//$NON-NLS-1$
-            "<<=",//$NON-NLS-1$
-            ">>=",//$NON-NLS-1$
-            ">>>=",//$NON-NLS-1$
-            "||",//$NON-NLS-1$
-            "&&",//$NON-NLS-1$
-            "+",//$NON-NLS-1$
-            "-",//$NON-NLS-1$
-            "!",//$NON-NLS-1$
-            "%",//$NON-NLS-1$
-            "^",//$NON-NLS-1$
-            "&",//$NON-NLS-1$
-            "*",//$NON-NLS-1$
-            "|",//$NON-NLS-1$
-            "~",//$NON-NLS-1$
-            "/",//$NON-NLS-1$
-            ">",//$NON-NLS-1$
-            "<",//$NON-NLS-1$
-            "(",//$NON-NLS-1$
-            ")",//$NON-NLS-1$
-            "{",//$NON-NLS-1$
-            "}",//$NON-NLS-1$
-            "[",//$NON-NLS-1$
-            "]",//$NON-NLS-1$
-            ";",//$NON-NLS-1$
-            "?",//$NON-NLS-1$
-            ":",//$NON-NLS-1$
-            ",",//$NON-NLS-1$
-            ".",//$NON-NLS-1$
-            "=",//$NON-NLS-1$
-            "",//$NON-NLS-1$
-            "$empty",//$NON-NLS-1$
-            "Identifier",//$NON-NLS-1$
-            "abstract",//$NON-NLS-1$
-            "assert",//$NON-NLS-1$
-            "boolean",//$NON-NLS-1$
-            "break",//$NON-NLS-1$
-            "byte",//$NON-NLS-1$
-            "case",//$NON-NLS-1$
-            "catch",//$NON-NLS-1$
-            "char",//$NON-NLS-1$
-            "class",//$NON-NLS-1$
-            "continue",//$NON-NLS-1$
-            "default",//$NON-NLS-1$
-            "do",//$NON-NLS-1$
-            "double",//$NON-NLS-1$
-            "else",//$NON-NLS-1$
-            "extends",//$NON-NLS-1$
-            "false",//$NON-NLS-1$
-            "final",//$NON-NLS-1$
-            "finally",//$NON-NLS-1$
-            "float",//$NON-NLS-1$
-            "for",//$NON-NLS-1$
-            "if",//$NON-NLS-1$
-            "implements",//$NON-NLS-1$
-            "import",//$NON-NLS-1$
-            "instanceof",//$NON-NLS-1$
-            "int",//$NON-NLS-1$
-            "interface",//$NON-NLS-1$
-            "long",//$NON-NLS-1$
-            "native",//$NON-NLS-1$
-            "new",//$NON-NLS-1$
-            "null",//$NON-NLS-1$
-            "package",//$NON-NLS-1$
-            "private",//$NON-NLS-1$
-            "protected",//$NON-NLS-1$
-            "public",//$NON-NLS-1$
-            "return",//$NON-NLS-1$
-            "short",//$NON-NLS-1$
-            "static",//$NON-NLS-1$
-            "strictfp",//$NON-NLS-1$
-            "super",//$NON-NLS-1$
-            "switch",//$NON-NLS-1$
-            "synchronized",//$NON-NLS-1$
-            "this",//$NON-NLS-1$
-            "throw",//$NON-NLS-1$
-            "throws",//$NON-NLS-1$
-            "transient",//$NON-NLS-1$
-            "true",//$NON-NLS-1$
-            "try",//$NON-NLS-1$
-            "void",//$NON-NLS-1$
-            "volatile",//$NON-NLS-1$
-            "while",//$NON-NLS-1$
-            "IntegerLiteral",//$NON-NLS-1$
-            "LongLiteral",//$NON-NLS-1$
-            "FloatingPointLiteral",//$NON-NLS-1$
-            "DoubleLiteral",//$NON-NLS-1$
-            "CharacterLiteral",//$NON-NLS-1$
-            "StringLiteral",//$NON-NLS-1$
-            UNEXPECTED_EOF,
-            "Invalid Character",//$NON-NLS-1$            
-            "Goal",//$NON-NLS-1$
-            "MethodBody",//$NON-NLS-1$
-            "ConstructorBody",//$NON-NLS-1$
-            "StaticInitializer",//$NON-NLS-1$
-            "Initializer",//$NON-NLS-1$
-            "Headers",//$NON-NLS-1$
-            "BlockStatements",//$NON-NLS-1$
-            "MethodPushModifiersHeader",//$NON-NLS-1$
-            "CatchHeader",//$NON-NLS-1$
-            "FieldDeclaration",//$NON-NLS-1$
-            "ImportDeclaration",//$NON-NLS-1$
-            "PackageDeclaration",//$NON-NLS-1$
-            "TypeDeclaration",//$NON-NLS-1$
-            "GenericMethodDeclaration",//$NON-NLS-1$
-            "ClassBodyDeclaration",//$NON-NLS-1$
-            "Expression",//$NON-NLS-1$
-            "Type",//$NON-NLS-1$
-            "PrimitiveType",//$NON-NLS-1$
-            "ReferenceType",//$NON-NLS-1$
-            "ClassOrInterfaceType",//$NON-NLS-1$
-            "ArrayType",//$NON-NLS-1$
-            "Name",//$NON-NLS-1$
-            "Dims",//$NON-NLS-1$
-            "ClassType",//$NON-NLS-1$
-            "SimpleName",//$NON-NLS-1$
-            "Header",//$NON-NLS-1$
-            "ClassHeader",//$NON-NLS-1$
-            "InterfaceHeader",//$NON-NLS-1$
-            "MethodHeader",//$NON-NLS-1$
-            "ConstructorHeader",//$NON-NLS-1$
-            "FormalParameter",//$NON-NLS-1$
-            "ImportDeclarations",//$NON-NLS-1$
-            "TypeDeclarations",//$NON-NLS-1$
-            "PackageDeclarationName",//$NON-NLS-1$
-            "SingleTypeImportDeclarationName",//$NON-NLS-1$
-            "TypeImportOnDemandDeclarationName",//$NON-NLS-1$
-            "Modifiers",//$NON-NLS-1$
-            "Modifier",//$NON-NLS-1$
-            "ClassBody",//$NON-NLS-1$
-            "ClassHeaderName",//$NON-NLS-1$
-            "InterfaceTypeList",//$NON-NLS-1$
-            "InterfaceType",//$NON-NLS-1$
-            "ClassBodyDeclarations",//$NON-NLS-1$
-            "Block",//$NON-NLS-1$
-            "VariableDeclarators",//$NON-NLS-1$
-            "VariableDeclarator",//$NON-NLS-1$
-            "VariableDeclaratorId",//$NON-NLS-1$
-            "VariableInitializer",//$NON-NLS-1$
-            "ArrayInitializer",//$NON-NLS-1$
-            "MethodHeaderName",//$NON-NLS-1$
-            "MethodHeaderParameters",//$NON-NLS-1$
-            "MethodPushModifiersHeaderName",//$NON-NLS-1$
-            "ClassTypeList",//$NON-NLS-1$
-            "ConstructorHeaderName",//$NON-NLS-1$
-            "FormalParameterList",//$NON-NLS-1$
-            "ClassTypeElt",//$NON-NLS-1$
-            "StaticOnly",//$NON-NLS-1$
-            "ExplicitConstructorInvocation",//$NON-NLS-1$
-            "Primary",//$NON-NLS-1$
-            "InterfaceBody",//$NON-NLS-1$
-            "InterfaceHeaderName",//$NON-NLS-1$
-            "InterfaceMemberDeclarations",//$NON-NLS-1$
-            "InterfaceMemberDeclaration",//$NON-NLS-1$
-            "VariableInitializers",//$NON-NLS-1$
-            "BlockStatement",//$NON-NLS-1$
-            "Statement",//$NON-NLS-1$
-            "LocalVariableDeclaration",//$NON-NLS-1$
-            "StatementWithoutTrailingSubstatement",//$NON-NLS-1$
-            "StatementNoShortIf",//$NON-NLS-1$
-            "StatementExpression",//$NON-NLS-1$
-            "PostIncrementExpression",//$NON-NLS-1$
-            "PostDecrementExpression",//$NON-NLS-1$
-            "MethodInvocation",//$NON-NLS-1$
-            "ClassInstanceCreationExpression",//$NON-NLS-1$
-            "SwitchBlock",//$NON-NLS-1$
-            "SwitchBlockStatements",//$NON-NLS-1$
-            "SwitchLabels",//$NON-NLS-1$
-            "SwitchBlockStatement",//$NON-NLS-1$
-            "SwitchLabel",//$NON-NLS-1$
-            "ConstantExpression",//$NON-NLS-1$
-            "StatementExpressionList",//$NON-NLS-1$
-            "OnlySynchronized",//$NON-NLS-1$
-            "Catches",//$NON-NLS-1$
-            "Finally",//$NON-NLS-1$
-            "CatchClause",//$NON-NLS-1$
-            "PushLPAREN",//$NON-NLS-1$
-            "PushRPAREN",//$NON-NLS-1$
-            "PrimaryNoNewArray",//$NON-NLS-1$
-            "FieldAccess",//$NON-NLS-1$
-            "ArrayAccess",//$NON-NLS-1$
-            "ClassInstanceCreationExpressionName",//$NON-NLS-1$
-            "ArgumentList",//$NON-NLS-1$
-            "DimWithOrWithOutExprs",//$NON-NLS-1$
-            "DimWithOrWithOutExpr",//$NON-NLS-1$
-            "DimsLoop",//$NON-NLS-1$
-            "OneDimLoop",//$NON-NLS-1$
-            "PostfixExpression",//$NON-NLS-1$
-            "UnaryExpression",//$NON-NLS-1$
-            "UnaryExpressionNotPlusMinus",//$NON-NLS-1$
-            "MultiplicativeExpression",//$NON-NLS-1$
-            "AdditiveExpression",//$NON-NLS-1$
-            "ShiftExpression",//$NON-NLS-1$
-            "RelationalExpression",//$NON-NLS-1$
-            "EqualityExpression",//$NON-NLS-1$
-            "AndExpression",//$NON-NLS-1$
-            "ExclusiveOrExpression",//$NON-NLS-1$
-            "InclusiveOrExpression",//$NON-NLS-1$
-            "ConditionalAndExpression",//$NON-NLS-1$
-            "ConditionalOrExpression",//$NON-NLS-1$
-            "ConditionalExpression",//$NON-NLS-1$
-            "AssignmentExpression",//$NON-NLS-1$
-            "LeftHandSide",//$NON-NLS-1$
-            "AssignmentOperator"//$NON-NLS-1$
+    try {
+      contents = Util.getFileCharContent(new File(dataFilename), null);
+    } catch (IOException ex) {
+      System.out.println(Util.bind("parser.incorrectPath")); //$NON-NLS-1$
+      return;
+    }
+    java.util.StringTokenizer st = new java.util.StringTokenizer(new String(contents), " \t\n\r[]={,;"); //$NON-NLS-1$
+    String[] tokens = new String[st.countTokens()];
+    int i = 0;
+    while (st.hasMoreTokens()) {
+      tokens[i++] = st.nextToken();
+    }
+    final String prefix = FILEPREFIX;
+    i = 0;
+    buildFileFor(prefix + (++i) + ".rsc", "lhs", tokens, false); //$NON-NLS-2$ //$NON-NLS-1$
+    buildFileFor(prefix + (++i) + ".rsc", "check_table", tokens, true); //$NON-NLS-2$ //$NON-NLS-1$
+    buildFileFor(prefix + (++i) + ".rsc", "asb", tokens, false); //$NON-NLS-2$ //$NON-NLS-1$
+    buildFileFor(prefix + (++i) + ".rsc", "asr", tokens, false); //$NON-NLS-2$ //$NON-NLS-1$
+    buildFileFor(prefix + (++i) + ".rsc", "symbol_index", tokens, false); //$NON-NLS-2$ //$NON-NLS-1$
+    System.out.println(Util.bind("parser.moveFiles")); //$NON-NLS-1$
+  }
+  /*
+   * Build initial recovery state.
+   * Recovery state is inferred from the current state of the parser (reduced node stack).
+   */
+  public RecoveredElement buildInitialRecoveryState() {
+
+    /* initialize recovery by retrieving available reduced nodes 
+     * also rebuild bracket balance 
+     */
+    lastCheckPoint = 0;
+
+    RecoveredElement element = null;
+    if (referenceContext instanceof CompilationUnitDeclaration) {
+      element = new RecoveredUnit(compilationUnit, 0, this);
+
+      /* ignore current stack state, since restarting from the beginnning 
+         since could not trust simple brace count */
+      if (true) { // experimenting restart recovery from scratch
+        compilationUnit.currentPackage = null;
+        compilationUnit.imports = null;
+        compilationUnit.types = null;
+        currentToken = 0;
+        listLength = 0;
+        return element;
+      }
+      if (compilationUnit.currentPackage != null) {
+        lastCheckPoint = compilationUnit.currentPackage.declarationSourceEnd + 1;
+      }
+      if (compilationUnit.imports != null) {
+        lastCheckPoint = compilationUnit.imports[compilationUnit.imports.length - 1].declarationSourceEnd + 1;
+      }
+    } else {
+      if (referenceContext instanceof AbstractMethodDeclaration) {
+        element = new RecoveredMethod((AbstractMethodDeclaration) referenceContext, null, 0, this);
+        lastCheckPoint = ((AbstractMethodDeclaration) referenceContext).bodyStart;
+      } else {
+        /* Initializer bodies are parsed in the context of the type declaration, we must thus search it inside */
+        if (referenceContext instanceof TypeDeclaration) {
+          TypeDeclaration type = (TypeDeclaration) referenceContext;
+          for (int i = 0; i < type.fields.length; i++) {
+            FieldDeclaration field = type.fields[i];
+            if (!field.isField()
+              && field.declarationSourceStart <= scanner.initialPosition
+              && scanner.initialPosition <= field.declarationSourceEnd
+              && scanner.eofPosition <= field.declarationSourceEnd + 1) {
+              element = new RecoveredInitializer((Initializer) field, null, 1, this);
+              lastCheckPoint = field.declarationSourceStart;
+              break;
+            }
+          }
+        }
+      }
+    }
+
+    if (element == null)
+      return element;
+
+    for (int i = 0; i <= astPtr; i++) {
+      AstNode node = astStack[i];
+      if (node instanceof AbstractMethodDeclaration) {
+        AbstractMethodDeclaration method = (AbstractMethodDeclaration) node;
+        if (method.declarationSourceEnd == 0) {
+          element = element.add(method, 0);
+          lastCheckPoint = method.bodyStart;
+        } else {
+          element = element.add(method, 0);
+          lastCheckPoint = method.declarationSourceEnd + 1;
+        }
+        continue;
+      }
+      if (node instanceof Initializer) {
+        Initializer initializer = (Initializer) node;
+        if (initializer.declarationSourceEnd == 0) {
+          element = element.add(initializer, 1);
+          lastCheckPoint = initializer.bodyStart;
+        } else {
+          element = element.add(initializer, 0);
+          lastCheckPoint = initializer.declarationSourceEnd + 1;
+        }
+        continue;
+      }
+      if (node instanceof FieldDeclaration) {
+        FieldDeclaration field = (FieldDeclaration) node;
+        if (field.declarationSourceEnd == 0) {
+          element = element.add(field, 0);
+          if (field.initialization == null) {
+            lastCheckPoint = field.sourceEnd + 1;
+          } else {
+            lastCheckPoint = field.initialization.sourceEnd + 1;
+          }
+        } else {
+          element = element.add(field, 0);
+          lastCheckPoint = field.declarationSourceEnd + 1;
+        }
+        continue;
+      }
+      if (node instanceof TypeDeclaration) {
+        TypeDeclaration type = (TypeDeclaration) node;
+        if (type.declarationSourceEnd == 0) {
+          element = element.add(type, 0);
+          lastCheckPoint = type.bodyStart;
+        } else {
+          element = element.add(type, 0);
+          lastCheckPoint = type.declarationSourceEnd + 1;
+        }
+        continue;
+      }
+      if (node instanceof ImportReference) {
+        ImportReference importRef = (ImportReference) node;
+        element = element.add(importRef, 0);
+        lastCheckPoint = importRef.declarationSourceEnd + 1;
+      }
+    }
+    return element;
+  }
+  protected static short check(int i) {
+    return check_table[i - (NUM_RULES + 1)];
+  }
+  /*
+   * Reconsider the entire source looking for inconsistencies in {} () []
+   */
+  public boolean checkAndReportBracketAnomalies(ProblemReporter problemReporter) {
+
+    scanner.wasAcr = false;
+    boolean anomaliesDetected = false;
+    try {
+      char[] source = scanner.source;
+      int[] leftCount = { 0, 0, 0 };
+      int[] rightCount = { 0, 0, 0 };
+      int[] depths = { 0, 0, 0 };
+      int[][] leftPositions = new int[][] { new int[10], new int[10], new int[10] };
+      int[][] leftDepths = new int[][] { new int[10], new int[10], new int[10] };
+      int[][] rightPositions = new int[][] { new int[10], new int[10], new int[10] };
+      int[][] rightDepths = new int[][] { new int[10], new int[10], new int[10] };
+      scanner.currentPosition = scanner.initialPosition; //starting point (first-zero-based char)
+      while (scanner.currentPosition < scanner.eofPosition) { //loop for jumping over comments
+        try {
+          // ---------Consume white space and handles startPosition---------
+          boolean isWhiteSpace;
+          do {
+            scanner.startPosition = scanner.currentPosition;
+            if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\')
+              && (source[scanner.currentPosition] == 'u')) {
+              isWhiteSpace = scanner.jumpOverUnicodeWhiteSpace();
+            } else {
+              if (scanner.recordLineSeparator && ((scanner.currentCharacter == '\r') || (scanner.currentCharacter == '\n'))) {
+                if (scanner.lineEnds[scanner.linePtr] < scanner.startPosition) {
+                  // only record line positions we have not recorded yet
+                  scanner.pushLineSeparator();
+                }
+              }
+              isWhiteSpace = Character.isWhitespace(scanner.currentCharacter);
+            }
+          } while (isWhiteSpace && (scanner.currentPosition < scanner.eofPosition));
+
+          // -------consume token until } is found---------
+
+          switch (scanner.currentCharacter) {
+            case '{' :
+              {
+                int index = leftCount[CurlyBracket]++;
+                if (index == leftPositions[CurlyBracket].length) {
+                  System.arraycopy(leftPositions[CurlyBracket], 0, (leftPositions[CurlyBracket] = new int[index * 2]), 0, index);
+                  System.arraycopy(leftDepths[CurlyBracket], 0, (leftDepths[CurlyBracket] = new int[index * 2]), 0, index);
+                }
+                leftPositions[CurlyBracket][index] = scanner.startPosition;
+                leftDepths[CurlyBracket][index] = depths[CurlyBracket]++;
+              }
+              break;
+            case '}' :
+              {
+                int index = rightCount[CurlyBracket]++;
+                if (index == rightPositions[CurlyBracket].length) {
+                  System.arraycopy(rightPositions[CurlyBracket], 0, (rightPositions[CurlyBracket] = new int[index * 2]), 0, index);
+                  System.arraycopy(rightDepths[CurlyBracket], 0, (rightDepths[CurlyBracket] = new int[index * 2]), 0, index);
+                }
+                rightPositions[CurlyBracket][index] = scanner.startPosition;
+                rightDepths[CurlyBracket][index] = --depths[CurlyBracket];
+              }
+              break;
+            case '(' :
+              {
+                int index = leftCount[RoundBracket]++;
+                if (index == leftPositions[RoundBracket].length) {
+                  System.arraycopy(leftPositions[RoundBracket], 0, (leftPositions[RoundBracket] = new int[index * 2]), 0, index);
+                  System.arraycopy(leftDepths[RoundBracket], 0, (leftDepths[RoundBracket] = new int[index * 2]), 0, index);
+                }
+                leftPositions[RoundBracket][index] = scanner.startPosition;
+                leftDepths[RoundBracket][index] = depths[RoundBracket]++;
+              }
+              break;
+            case ')' :
+              {
+                int index = rightCount[RoundBracket]++;
+                if (index == rightPositions[RoundBracket].length) {
+                  System.arraycopy(rightPositions[RoundBracket], 0, (rightPositions[RoundBracket] = new int[index * 2]), 0, index);
+                  System.arraycopy(rightDepths[RoundBracket], 0, (rightDepths[RoundBracket] = new int[index * 2]), 0, index);
+                }
+                rightPositions[RoundBracket][index] = scanner.startPosition;
+                rightDepths[RoundBracket][index] = --depths[RoundBracket];
+              }
+              break;
+            case '[' :
+              {
+                int index = leftCount[SquareBracket]++;
+                if (index == leftPositions[SquareBracket].length) {
+                  System.arraycopy(leftPositions[SquareBracket], 0, (leftPositions[SquareBracket] = new int[index * 2]), 0, index);
+                  System.arraycopy(leftDepths[SquareBracket], 0, (leftDepths[SquareBracket] = new int[index * 2]), 0, index);
+                }
+                leftPositions[SquareBracket][index] = scanner.startPosition;
+                leftDepths[SquareBracket][index] = depths[SquareBracket]++;
+              }
+              break;
+            case ']' :
+              {
+                int index = rightCount[SquareBracket]++;
+                if (index == rightPositions[SquareBracket].length) {
+                  System.arraycopy(
+                    rightPositions[SquareBracket],
+                    0,
+                    (rightPositions[SquareBracket] = new int[index * 2]),
+                    0,
+                    index);
+                  System.arraycopy(rightDepths[SquareBracket], 0, (rightDepths[SquareBracket] = new int[index * 2]), 0, index);
+                }
+                rightPositions[SquareBracket][index] = scanner.startPosition;
+                rightDepths[SquareBracket][index] = --depths[SquareBracket];
+              }
+              break;
+            case '\'' :
+              {
+                if (scanner.getNextChar('\\')) {
+                  scanner.scanEscapeCharacter();
+                } else { // consume next character
+                  scanner.unicodeAsBackSlash = false;
+                  if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\')
+                    && (source[scanner.currentPosition] == 'u')) {
+                    scanner.getNextUnicodeChar();
+                  } else {
+                    if (scanner.withoutUnicodePtr != 0) {
+                      scanner.withoutUnicodeBuffer[++scanner.withoutUnicodePtr] = scanner.currentCharacter;
+                    }
+                  }
+                }
+                scanner.getNextChar('\'');
+                break;
+              }
+            case '"' : // consume next character
+              scanner.unicodeAsBackSlash = false;
+              if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\')
+                && (source[scanner.currentPosition] == 'u')) {
+                scanner.getNextUnicodeChar();
+              } else {
+                if (scanner.withoutUnicodePtr != 0) {
+                  scanner.withoutUnicodeBuffer[++scanner.withoutUnicodePtr] = scanner.currentCharacter;
+                }
+              }
+              while (scanner.currentCharacter != '"') {
+                if (scanner.currentCharacter == '\r') {
+                  if (source[scanner.currentPosition] == '\n')
+                    scanner.currentPosition++;
+                  break; // the string cannot go further that the line
+                }
+                if (scanner.currentCharacter == '\n') {
+                  break; // the string cannot go further that the line
+                }
+                if (scanner.currentCharacter == '\\') {
+                  scanner.scanEscapeCharacter();
+                }
+                // consume next character
+                scanner.unicodeAsBackSlash = false;
+                if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\')
+                  && (source[scanner.currentPosition] == 'u')) {
+                  scanner.getNextUnicodeChar();
+                } else {
+                  if (scanner.withoutUnicodePtr != 0) {
+                    scanner.withoutUnicodeBuffer[++scanner.withoutUnicodePtr] = scanner.currentCharacter;
+                  }
+                }
+              }
+              break;
+            case '/' :
+              {
+                int test;
+                if ((test = scanner.getNextChar('/', '*')) == 0) { //line comment 
+                  //get the next char 
+                  if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\')
+                    && (source[scanner.currentPosition] == 'u')) {
+                    //-------------unicode traitement ------------
+                    int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
+                    scanner.currentPosition++;
+                    while (source[scanner.currentPosition] == 'u') {
+                      scanner.currentPosition++;
+                    }
+                    if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                      || c1 < 0
+                      || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                      || c2 < 0
+                      || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                      || c3 < 0
+                      || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                      || c4 < 0) { //error don't care of the value
+                      scanner.currentCharacter = 'A';
+                    } //something different from \n and \r
+                    else {
+                      scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
+                    }
+                  }
+                  while (scanner.currentCharacter != '\r' && scanner.currentCharacter != '\n') {
+                    //get the next char
+                    scanner.startPosition = scanner.currentPosition;
+                    if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\')
+                      && (source[scanner.currentPosition] == 'u')) {
+                      //-------------unicode traitement ------------
+                      int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
+                      scanner.currentPosition++;
+                      while (source[scanner.currentPosition] == 'u') {
+                        scanner.currentPosition++;
+                      }
+                      if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                        || c1 < 0
+                        || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                        || c2 < 0
+                        || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                        || c3 < 0
+                        || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                        || c4 < 0) { //error don't care of the value
+                        scanner.currentCharacter = 'A';
+                      } //something different from \n and \r
+                      else {
+                        scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
+                      }
+                    }
+                  }
+                  if (scanner.recordLineSeparator && ((scanner.currentCharacter == '\r') || (scanner.currentCharacter == '\n'))) {
+                    if (scanner.lineEnds[scanner.linePtr] < scanner.startPosition) {
+                      // only record line positions we have not recorded yet
+                      scanner.pushLineSeparator();
+                    }
+                  }
+                  break;
+                }
+                if (test > 0) { //traditional and annotation comment
+                  boolean star = false;
+                  // consume next character
+                  scanner.unicodeAsBackSlash = false;
+                  if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\')
+                    && (source[scanner.currentPosition] == 'u')) {
+                    scanner.getNextUnicodeChar();
+                  } else {
+                    if (scanner.withoutUnicodePtr != 0) {
+                      scanner.withoutUnicodeBuffer[++scanner.withoutUnicodePtr] = scanner.currentCharacter;
+                    }
+                  }
+                  if (scanner.currentCharacter == '*') {
+                    star = true;
+                  }
+                  //get the next char 
+                  if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\')
+                    && (source[scanner.currentPosition] == 'u')) {
+                    //-------------unicode traitement ------------
+                    int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
+                    scanner.currentPosition++;
+                    while (source[scanner.currentPosition] == 'u') {
+                      scanner.currentPosition++;
+                    }
+                    if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                      || c1 < 0
+                      || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                      || c2 < 0
+                      || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                      || c3 < 0
+                      || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                      || c4 < 0) { //error don't care of the value
+                      scanner.currentCharacter = 'A';
+                    } //something different from * and /
+                    else {
+                      scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
+                    }
+                  }
+                  //loop until end of comment */ 
+                  while ((scanner.currentCharacter != '/') || (!star)) {
+                    star = scanner.currentCharacter == '*';
+                    //get next char
+                    if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\')
+                      && (source[scanner.currentPosition] == 'u')) {
+                      //-------------unicode traitement ------------
+                      int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
+                      scanner.currentPosition++;
+                      while (source[scanner.currentPosition] == 'u') {
+                        scanner.currentPosition++;
+                      }
+                      if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                        || c1 < 0
+                        || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                        || c2 < 0
+                        || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                        || c3 < 0
+                        || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15
+                        || c4 < 0) { //error don't care of the value
+                        scanner.currentCharacter = 'A';
+                      } //something different from * and /
+                      else {
+                        scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
+                      }
+                    }
+                  }
+                  break;
+                }
+                break;
+              }
+            default :
+              if (Character.isJavaIdentifierStart(scanner.currentCharacter)) {
+                scanner.scanIdentifierOrKeyword();
+                break;
+              }
+              if (Character.isDigit(scanner.currentCharacter)) {
+                scanner.scanNumber(false);
+                break;
+              }
+          }
+          //-----------------end switch while try--------------------
+        } catch (IndexOutOfBoundsException e) {
+          break; // read until EOF
+        } catch (InvalidInputException e) {
+          return false; // no clue
+        }
+      }
+      if (scanner.recordLineSeparator) {
+        compilationUnit.compilationResult.lineSeparatorPositions = scanner.getLineEnds();
+      }
+
+      // check placement anomalies against other kinds of brackets
+      for (int kind = 0; kind < BracketKinds; kind++) {
+        for (int leftIndex = leftCount[kind] - 1; leftIndex >= 0; leftIndex--) {
+          int start = leftPositions[kind][leftIndex]; // deepest first
+          // find matching closing bracket
+          int depth = leftDepths[kind][leftIndex];
+          int end = -1;
+          for (int i = 0; i < rightCount[kind]; i++) {
+            int pos = rightPositions[kind][i];
+            // want matching bracket further in source with same depth
+            if ((pos > start) && (depth == rightDepths[kind][i])) {
+              end = pos;
+              break;
+            }
+          }
+          if (end < 0) { // did not find a good closing match
+            problemReporter.unmatchedBracket(start, referenceContext, compilationUnit.compilationResult);
+            return true;
+          }
+          // check if even number of opening/closing other brackets in between this pair of brackets
+          int balance = 0;
+          for (int otherKind = 0;(balance == 0) && (otherKind < BracketKinds); otherKind++) {
+            for (int i = 0; i < leftCount[otherKind]; i++) {
+              int pos = leftPositions[otherKind][i];
+              if ((pos > start) && (pos < end))
+                balance++;
+            }
+            for (int i = 0; i < rightCount[otherKind]; i++) {
+              int pos = rightPositions[otherKind][i];
+              if ((pos > start) && (pos < end))
+                balance--;
+            }
+            if (balance != 0) {
+              problemReporter.unmatchedBracket(start, referenceContext, compilationUnit.compilationResult); //bracket anomaly
+              return true;
+            }
+          }
+        }
+        // too many opening brackets ?
+        for (int i = rightCount[kind]; i < leftCount[kind]; i++) {
+          anomaliesDetected = true;
+          problemReporter.unmatchedBracket(
+            leftPositions[kind][leftCount[kind] - i - 1],
+            referenceContext,
+            compilationUnit.compilationResult);
+        }
+        // too many closing brackets ?
+        for (int i = leftCount[kind]; i < rightCount[kind]; i++) {
+          anomaliesDetected = true;
+          problemReporter.unmatchedBracket(rightPositions[kind][i], referenceContext, compilationUnit.compilationResult);
+        }
+        if (anomaliesDetected)
+          return true;
+      }
+
+      return anomaliesDetected;
+    } catch (ArrayStoreException e) { // jdk1.2.2 jit bug
+      return anomaliesDetected;
+    } catch (NullPointerException e) { // jdk1.2.2 jit bug
+      return anomaliesDetected;
+    }
+  }
+  public final void checkAndSetModifiers(int flag) {
+    /*modify the current modifiers buffer.
+    When the startPosition of the modifiers is 0
+    it means that the modifier being parsed is the first
+    of a list of several modifiers. The startPosition
+    is zeroed when a copy of modifiers-buffer is push
+    onto the astStack. */
+
+    if ((modifiers & flag) != 0) { // duplicate modifier
+      modifiers |= AccAlternateModifierProblem;
+    }
+    modifiers |= flag;
+
+    if (modifiersSourceStart < 0)
+      modifiersSourceStart = scanner.startPosition;
+  }
+  public void checkAnnotation() {
+
+    boolean deprecated = false;
+    boolean checkDeprecated = false;
+    int lastAnnotationIndex = -1;
+
+    //since jdk1.2 look only in the last java doc comment...
+    found : for (lastAnnotationIndex = scanner.commentPtr; lastAnnotationIndex >= 0; lastAnnotationIndex--) {
+      //look for @deprecated into the first javadoc comment preceeding the declaration
+      int commentSourceStart = scanner.commentStarts[lastAnnotationIndex];
+      // javadoc only (non javadoc comment have negative end positions.)
+      if (modifiersSourceStart != -1 && modifiersSourceStart < commentSourceStart) {
+        continue;
+      }
+      if (scanner.commentStops[lastAnnotationIndex] < 0) {
+        break found;
+      }
+      checkDeprecated = true;
+      int commentSourceEnd = scanner.commentStops[lastAnnotationIndex] - 1; //stop is one over
+      char[] comment = scanner.source;
+
+      for (int i = commentSourceStart + 3; i < commentSourceEnd - 10; i++) {
+        if ((comment[i] == '@')
+          && (comment[i + 1] == 'd')
+          && (comment[i + 2] == 'e')
+          && (comment[i + 3] == 'p')
+          && (comment[i + 4] == 'r')
+          && (comment[i + 5] == 'e')
+          && (comment[i + 6] == 'c')
+          && (comment[i + 7] == 'a')
+          && (comment[i + 8] == 't')
+          && (comment[i + 9] == 'e')
+          && (comment[i + 10] == 'd')) {
+          // ensure the tag is properly ended: either followed by a space, a tab, line end or asterisk.
+          int nextPos = i + 11;
+          deprecated =
+            (comment[nextPos] == ' ')
+              || (comment[nextPos] == '\t')
+              || (comment[nextPos] == '\n')
+              || (comment[nextPos] == '\r')
+              || (comment[nextPos] == '*');
+          break found;
+        }
+      }
+      break found;
+    }
+    if (deprecated) {
+      checkAndSetModifiers(AccDeprecated);
+    }
+    // modify the modifier source start to point at the first comment
+    if (lastAnnotationIndex >= 0 && checkDeprecated) {
+      modifiersSourceStart = scanner.commentStarts[lastAnnotationIndex];
+    }
+  }
+  protected void classInstanceCreation(boolean alwaysQualified) {
+    // ClassInstanceCreationExpression ::= 'new' ClassType '(' ArgumentListopt ')' ClassBodyopt
+
+    // ClassBodyopt produces a null item on the astStak if it produces NO class body
+    // An empty class body produces a 0 on the length stack.....
+
+    AllocationExpression alloc;
+    int length;
+    if (((length = astLengthStack[astLengthPtr--]) == 1) && (astStack[astPtr] == null)) {
+      //NO ClassBody
+      astPtr--;
+      if (alwaysQualified) {
+        alloc = new QualifiedAllocationExpression();
+      } else {
+        alloc = new AllocationExpression();
+      }
+      alloc.sourceEnd = endPosition; //the position has been stored explicitly
+
+      if ((length = expressionLengthStack[expressionLengthPtr--]) != 0) {
+        expressionPtr -= length;
+        System.arraycopy(expressionStack, expressionPtr + 1, alloc.arguments = new Expression[length], 0, length);
+      }
+      alloc.type = getTypeReference(0);
+      //the default constructor with the correct number of argument
+      //will be created and added by the TC (see createsInternalConstructorWithBinding)
+      alloc.sourceStart = intStack[intPtr--];
+      pushOnExpressionStack(alloc);
+    } else {
+      dispatchDeclarationInto(length);
+      AnonymousLocalTypeDeclaration anonymousTypeDeclaration = (AnonymousLocalTypeDeclaration) astStack[astPtr];
+      anonymousTypeDeclaration.declarationSourceEnd = endStatementPosition;
+      anonymousTypeDeclaration.bodyEnd = endStatementPosition;
+      if (anonymousTypeDeclaration.allocation != null) {
+        anonymousTypeDeclaration.allocation.sourceEnd = endStatementPosition;
+      }
+      astPtr--;
+      astLengthPtr--;
+
+      // mark fields and initializer with local type mark if needed
+      markFieldsWithLocalType(anonymousTypeDeclaration);
+    }
+  }
+  protected final void concatExpressionLists() {
+    expressionLengthStack[--expressionLengthPtr]++;
+  }
+  private final void concatNodeLists() {
+    /*
+     * This is a case where you have two sublists into the astStack that you want
+     * to merge in one list. There is no action required on the astStack. The only
+     * thing you need to do is merge the two lengths specified on the astStackLength.
+     * The top two length are for example:
+     * ... p   n
+     * and you want to result in a list like:
+     * ... n+p 
+     * This means that the p could be equals to 0 in case there is no astNode pushed
+     * on the astStack.
+     * Look at the InterfaceMemberDeclarations for an example.
+     */
+
+    astLengthStack[astLengthPtr - 1] += astLengthStack[astLengthPtr--];
+  }
+  protected void consumeAllocationHeader() {
+    // ClassInstanceCreationExpression ::= 'new' ClassType '(' ArgumentListopt ')' ClassBodyopt
+
+    // ClassBodyopt produces a null item on the astStak if it produces NO class body
+    // An empty class body produces a 0 on the length stack.....
+
+    if (currentElement == null) {
+      return; // should never occur, this consumeRule is only used in recovery mode
+    }
+    if (currentToken == TokenNameLBRACE) {
+      // beginning of an anonymous type
+      AnonymousLocalTypeDeclaration anonymousType = new AnonymousLocalTypeDeclaration(this.compilationUnit.compilationResult);
+      anonymousType.sourceStart = intStack[intPtr--];
+      anonymousType.sourceEnd = rParenPos; // closing parenthesis
+      lastCheckPoint = anonymousType.bodyStart = scanner.currentPosition;
+      currentElement = currentElement.add(anonymousType, 0);
+      lastIgnoredToken = -1;
+      currentToken = 0; // opening brace already taken into account
+      return;
+    }
+    lastCheckPoint = scanner.startPosition; // force to restart at this exact position
+    restartRecovery = true; // request to restart from here on
+  }
+  protected void consumeArgumentList() {
+    // ArgumentList ::= ArgumentList ',' Expression
+    concatExpressionLists();
+  }
+  protected void consumeArrayAccess(boolean unspecifiedReference) {
+    // ArrayAccess ::= Name '[' Expression ']' ==> true
+    // ArrayAccess ::= PrimaryNoNewArray '[' Expression ']' ==> false
+
+    //optimize push/pop
+    Expression exp;
+    if (unspecifiedReference) {
+      exp = expressionStack[expressionPtr] = new ArrayReference(getUnspecifiedReferenceOptimized(), expressionStack[expressionPtr]);
+    } else {
+      expressionPtr--;
+      expressionLengthPtr--;
+      exp = expressionStack[expressionPtr] = new ArrayReference(expressionStack[expressionPtr], expressionStack[expressionPtr + 1]);
+    }
+    exp.sourceEnd = endPosition;
+  }
+  protected void consumeArrayCreationExpression() {
+    // ArrayCreationExpression ::= 'new' PrimitiveType DimWithOrWithOutExprs ArrayInitializeropt
+    // ArrayCreationExpression ::= 'new' ClassOrInterfaceType DimWithOrWithOutExprs ArrayInitializeropt
+
+    int length;
+    ArrayAllocationExpression aae = new ArrayAllocationExpression();
+    if (expressionLengthStack[expressionLengthPtr] != 0) {
+      expressionLengthPtr--;
+      aae.initializer = (ArrayInitializer) expressionStack[expressionPtr--];
+    } else {
+      expressionLengthPtr--;
+    }
+
+    aae.type = getTypeReference(0);
+    length = (expressionLengthStack[expressionLengthPtr--]);
+    expressionPtr -= length;
+    System.arraycopy(expressionStack, expressionPtr + 1, aae.dimensions = new Expression[length], 0, length);
+    aae.sourceStart = intStack[intPtr--];
+    if (aae.initializer == null) {
+      aae.sourceEnd = endPosition;
+    } else {
+      aae.sourceEnd = aae.initializer.sourceEnd;
+    }
+    pushOnExpressionStack(aae);
+  }
+  protected void consumeArrayInitializer() {
+    // ArrayInitializer ::= '{' VariableInitializers '}'
+    // ArrayInitializer ::= '{' VariableInitializers , '}'
+
+    arrayInitializer(expressionLengthStack[expressionLengthPtr--]);
+  }
+
+  protected void consumeAssertStatement() {
+    // AssertStatement ::= 'assert' Expression ':' Expression ';'
+    expressionLengthPtr -= 2;
+    pushOnAstStack(new AssertStatement(expressionStack[expressionPtr--], expressionStack[expressionPtr--], intStack[intPtr--]));
+  }
+
+  protected void consumeAssignment() {
+    // Assignment ::= LeftHandSide AssignmentOperator AssignmentExpression
+    //optimize the push/pop
+
+    int op = intStack[intPtr--]; //<--the encoded operator
+
+    expressionPtr--;
+    expressionLengthPtr--;
+    expressionStack[expressionPtr] =
+      (op != EQUAL)
+        ? new CompoundAssignment(expressionStack[expressionPtr], expressionStack[expressionPtr + 1], op, scanner.startPosition - 1)
+        : new Assignment(expressionStack[expressionPtr], expressionStack[expressionPtr + 1], scanner.startPosition - 1);
+  }
+  protected void consumeAssignmentOperator(int pos) {
+    // AssignmentOperator ::= '='
+    // AssignmentOperator ::= '*='
+    // AssignmentOperator ::= '/='
+    // AssignmentOperator ::= '%='
+    // AssignmentOperator ::= '+='
+    // AssignmentOperator ::= '-='
+    // AssignmentOperator ::= '<<='
+    // AssignmentOperator ::= '>>='
+    // AssignmentOperator ::= '>>>='
+    // AssignmentOperator ::= '&='
+    // AssignmentOperator ::= '^='
+    // AssignmentOperator ::= '|='
+
+    try {
+      intStack[++intPtr] = pos;
+    } catch (IndexOutOfBoundsException e) {
+      //intPtr is correct 
+      int oldStackLength = intStack.length;
+      int oldStack[] = intStack;
+      intStack = new int[oldStackLength + StackIncrement];
+      System.arraycopy(oldStack, 0, intStack, 0, oldStackLength);
+      intStack[intPtr] = pos;
+    }
+  }
+  protected void consumeBinaryExpression(int op) {
+    // MultiplicativeExpression ::= MultiplicativeExpression '*' UnaryExpression
+    // MultiplicativeExpression ::= MultiplicativeExpression '/' UnaryExpression
+    // MultiplicativeExpression ::= MultiplicativeExpression '%' UnaryExpression
+    // AdditiveExpression ::= AdditiveExpression '+' MultiplicativeExpression
+    // AdditiveExpression ::= AdditiveExpression '-' MultiplicativeExpression
+    // ShiftExpression ::= ShiftExpression '<<'  AdditiveExpression
+    // ShiftExpression ::= ShiftExpression '>>'  AdditiveExpression
+    // ShiftExpression ::= ShiftExpression '>>>' AdditiveExpression
+    // RelationalExpression ::= RelationalExpression '<'  ShiftExpression
+    // RelationalExpression ::= RelationalExpression '>'  ShiftExpression
+    // RelationalExpression ::= RelationalExpression '<=' ShiftExpression
+    // RelationalExpression ::= RelationalExpression '>=' ShiftExpression
+    // AndExpression ::= AndExpression '&' EqualityExpression
+    // ExclusiveOrExpression ::= ExclusiveOrExpression '^' AndExpression
+    // InclusiveOrExpression ::= InclusiveOrExpression '|' ExclusiveOrExpression
+    // ConditionalAndExpression ::= ConditionalAndExpression '&&' InclusiveOrExpression
+    // ConditionalOrExpression ::= ConditionalOrExpression '||' ConditionalAndExpression
+
+    //optimize the push/pop
+
+    expressionPtr--;
+    expressionLengthPtr--;
+    if (op == OR_OR) {
+      expressionStack[expressionPtr] = new OR_OR_Expression(expressionStack[expressionPtr], expressionStack[expressionPtr + 1], op);
+    } else {
+      if (op == AND_AND) {
+        expressionStack[expressionPtr] =
+          new AND_AND_Expression(expressionStack[expressionPtr], expressionStack[expressionPtr + 1], op);
+      } else {
+        // look for "string1" + "string2"
+        if ((op == PLUS) && optimizeStringLiterals) {
+          Expression expr1, expr2;
+          expr1 = expressionStack[expressionPtr];
+          expr2 = expressionStack[expressionPtr + 1];
+          if (expr1 instanceof StringLiteral) {
+            if (expr2 instanceof CharLiteral) { // string+char
+              expressionStack[expressionPtr] = ((StringLiteral) expr1).extendWith((CharLiteral) expr2);
+            } else if (expr2 instanceof StringLiteral) { //string+string
+              expressionStack[expressionPtr] = ((StringLiteral) expr1).extendWith((StringLiteral) expr2);
+            } else {
+              expressionStack[expressionPtr] = new BinaryExpression(expr1, expr2, PLUS);
+            }
+          } else {
+            expressionStack[expressionPtr] = new BinaryExpression(expr1, expr2, PLUS);
+          }
+        } else {
+          expressionStack[expressionPtr] =
+            new BinaryExpression(expressionStack[expressionPtr], expressionStack[expressionPtr + 1], op);
+        }
+      }
+    }
+  }
+  protected void consumeBlock() {
+    // Block ::= OpenBlock '{' BlockStatementsopt '}'
+    // simpler action for empty blocks
+
+    int length;
+    if ((length = astLengthStack[astLengthPtr--]) == 0) { // empty block 
+      pushOnAstStack(Block.EmptyWith(intStack[intPtr--], endStatementPosition));
+      realBlockPtr--; // still need to pop the block variable counter
+    } else {
+      Block bk = new Block(realBlockStack[realBlockPtr--]);
+      astPtr -= length;
+      System.arraycopy(astStack, astPtr + 1, bk.statements = new Statement[length], 0, length);
+      pushOnAstStack(bk);
+      bk.sourceStart = intStack[intPtr--];
+      bk.sourceEnd = endStatementPosition;
+    }
+  }
+  protected void consumeBlockStatements() {
+    // BlockStatements ::= BlockStatements BlockStatement
+    concatNodeLists();
+  }
+  protected void consumeCaseLabel() {
+    // SwitchLabel ::= 'case' ConstantExpression ':'
+    expressionLengthPtr--;
+    pushOnAstStack(new Case(intStack[intPtr--], expressionStack[expressionPtr--]));
+  }
+  protected void consumeCastExpression() {
+    // CastExpression ::= PushLPAREN PrimitiveType Dimsopt PushRPAREN UnaryExpression
+    // CastExpression ::= PushLPAREN Name Dims PushRPAREN UnaryExpressionNotPlusMinus
+
+    //intStack : posOfLeftParen dim posOfRightParen
+
+    //optimize the push/pop
+
+    Expression exp, cast, castType;
+    int end = intStack[intPtr--];
+    expressionStack[expressionPtr] =
+      cast = new CastExpression(exp = expressionStack[expressionPtr], castType = getTypeReference(intStack[intPtr--]));
+    castType.sourceEnd = end - 1;
+    castType.sourceStart = (cast.sourceStart = intStack[intPtr--]) + 1;
+    cast.sourceEnd = exp.sourceEnd;
+  }
+  protected void consumeCastExpressionLL1() {
+    //CastExpression ::= '(' Expression ')' UnaryExpressionNotPlusMinus
+    // Expression is used in order to make the grammar LL1
+
+    //optimize push/pop
+
+    Expression castType, cast, exp;
+    expressionPtr--;
+    expressionStack[expressionPtr] =
+      cast =
+        new CastExpression(exp = expressionStack[expressionPtr + 1], castType = getTypeReference(expressionStack[expressionPtr]));
+    expressionLengthPtr--;
+    updateSourcePosition(castType);
+    cast.sourceStart = castType.sourceStart;
+    cast.sourceEnd = exp.sourceEnd;
+    castType.sourceStart++;
+    castType.sourceEnd--;
+  }
+  protected void consumeCatches() {
+    // Catches ::= Catches CatchClause
+    optimizedConcatNodeLists();
+  }
+  protected void consumeCatchHeader() {
+    // CatchDeclaration ::= 'catch' '(' FormalParameter ')' '{'
+
+    if (currentElement == null) {
+      return; // should never occur, this consumeRule is only used in recovery mode
+    }
+    // current element should be a block due to the presence of the opening brace
+    if (!(currentElement instanceof RecoveredBlock)) {
+      return;
+    }
+    // exception argument is already on astStack
+    ((RecoveredBlock) currentElement).attach(new RecoveredLocalVariable((Argument) astStack[astPtr--], currentElement, 0));
+    // insert catch variable in catch block
+    lastCheckPoint = scanner.startPosition; // force to restart at this exact position
+    restartRecovery = true; // request to restart from here on
+    lastIgnoredToken = -1;
+  }
+  protected void consumeClassBodyDeclaration() {
+    // ClassBodyDeclaration ::= Diet Block
+    //push an Initializer
+    //optimize the push/pop
+    nestedMethod[nestedType]--;
+    Initializer initializer = new Initializer((Block) astStack[astPtr], 0);
+    intPtr--; // pop sourcestart left on the stack by consumeNestedMethod.
+    realBlockPtr--; // pop the block variable counter left on the stack by consumeNestedMethod
+    int javadocCommentStart = intStack[intPtr--];
+    if (javadocCommentStart != -1) {
+      initializer.declarationSourceStart = javadocCommentStart;
+    }
+    astStack[astPtr] = initializer;
+    initializer.sourceEnd = endStatementPosition;
+    initializer.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition);
+  }
+  protected void consumeClassBodyDeclarations() {
+    // ClassBodyDeclarations ::= ClassBodyDeclarations ClassBodyDeclaration
+    concatNodeLists();
+  }
+  protected void consumeClassBodyDeclarationsopt() {
+    // ClassBodyDeclarationsopt ::= NestedType ClassBodyDeclarations
+    nestedType--;
+  }
+  protected void consumeClassBodyopt() {
+    // ClassBodyopt ::= $empty
+    pushOnAstStack(null);
+    endPosition = scanner.startPosition - 1;
+  }
+  protected void consumeClassDeclaration() {
+    // ClassDeclaration ::= ClassHeader ClassBody
+
+    int length;
+    if ((length = astLengthStack[astLengthPtr--]) != 0) {
+      //there are length declarations
+      //dispatch according to the type of the declarations
+      dispatchDeclarationInto(length);
+    }
+
+    TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
+
+    // mark fields and initializer with local type mark if needed
+    markFieldsWithLocalType(typeDecl);
+
+    //convert constructor that do not have the type's name into methods
+    boolean hasConstructor = typeDecl.checkConstructors(this);
+
+    //add the default constructor when needed (interface don't have it)
+    if (!hasConstructor) {
+      boolean insideFieldInitializer = false;
+      if (diet) {
+        for (int i = nestedType; i > 0; i--) {
+          if (variablesCounter[i] > 0) {
+            insideFieldInitializer = true;
+            break;
+          }
+        }
+      }
+      typeDecl.createsInternalConstructor(!diet || insideFieldInitializer, true);
+    }
+
+    //always add <clinit> (will be remove at code gen time if empty)
+    if (this.scanner.containsAssertKeyword) {
+      typeDecl.bits |= AstNode.AddAssertionMASK;
+    }
+    typeDecl.addClinit();
+    typeDecl.bodyEnd = endStatementPosition;
+    typeDecl.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition);
+  }
+  protected void consumeClassHeader() {
+    // ClassHeader ::= ClassHeaderName ClassHeaderExtendsopt ClassHeaderImplementsopt
+
+    TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
+    if (currentToken == TokenNameLBRACE) {
+      typeDecl.bodyStart = scanner.currentPosition;
+    }
+    if (currentElement != null) {
+      restartRecovery = true; // used to avoid branching back into the regular automaton               
+    }
+    // flush the comments related to the class header
+    scanner.commentPtr = -1;
+  }
+  protected void consumeClassHeaderExtends() {
+    // ClassHeaderExtends ::= 'extends' ClassType
+    // There is a class declaration on the top of stack
+    TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
+    //superclass
+    typeDecl.superclass = getTypeReference(0);
+    typeDecl.bodyStart = typeDecl.superclass.sourceEnd + 1;
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = typeDecl.bodyStart;
+    }
+  }
+  protected void consumeClassHeaderImplements() {
+    // ClassHeaderImplements ::= 'implements' InterfaceTypeList
+    int length = astLengthStack[astLengthPtr--];
+    //super interfaces
+    astPtr -= length;
+    // There is a class declaration on the top of stack
+    TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
+    System.arraycopy(astStack, astPtr + 1, typeDecl.superInterfaces = new TypeReference[length], 0, length);
+    typeDecl.bodyStart = typeDecl.superInterfaces[length - 1].sourceEnd + 1;
+    listLength = 0; // reset after having read super-interfaces
+    // recovery
+    if (currentElement != null) { // is recovering
+      lastCheckPoint = typeDecl.bodyStart;
+    }
+  }
+  protected void consumeClassHeaderName() {
+    // ClassHeaderName ::= Modifiersopt 'class' 'Identifier'
+    TypeDeclaration typeDecl;
+    if (nestedMethod[nestedType] == 0) {
+      if (nestedType != 0) {
+        typeDecl = new MemberTypeDeclaration(this.compilationUnit.compilationResult);
+      } else {
+        typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult);
+      }
+    } else {
+      // Record that the block has a declaration for local types
+      typeDecl = new LocalTypeDeclaration(this.compilationUnit.compilationResult);
+      markCurrentMethodWithLocalType();
+      blockReal();
+    }
+
+    //highlight the name of the type
+    long pos = identifierPositionStack[identifierPtr];
+    typeDecl.sourceEnd = (int) pos;
+    typeDecl.sourceStart = (int) (pos >>> 32);
+    typeDecl.name = identifierStack[identifierPtr--];
+    identifierLengthPtr--;
+
+    //compute the declaration source too
+    // 'class' and 'interface' push two int positions: the beginning of the class token and its end.
+    // we want to keep the beginning position but get rid of the end position
+    // it is only used for the ClassLiteralAccess positions.
+    typeDecl.declarationSourceStart = intStack[intPtr--];
+    intPtr--; // remove the end position of the class token
+
+    typeDecl.modifiersSourceStart = intStack[intPtr--];
+    typeDecl.modifiers = intStack[intPtr--];
+    if (typeDecl.modifiersSourceStart >= 0) {
+      typeDecl.declarationSourceStart = typeDecl.modifiersSourceStart;
+    }
+    typeDecl.bodyStart = typeDecl.sourceEnd + 1;
+    pushOnAstStack(typeDecl);
+
+    listLength = 0; // will be updated when reading super-interfaces
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = typeDecl.bodyStart;
+      currentElement = currentElement.add(typeDecl, 0);
+      lastIgnoredToken = -1;
+    }
+  }
+  protected void consumeClassInstanceCreationExpression() {
+    // ClassInstanceCreationExpression ::= 'new' ClassType '(' ArgumentListopt ')' ClassBodyopt
+    classInstanceCreation(false);
+  }
+  protected void consumeClassInstanceCreationExpressionName() {
+    // ClassInstanceCreationExpressionName ::= Name '.'
+    pushOnExpressionStack(getUnspecifiedReferenceOptimized());
+  }
+  protected void consumeClassInstanceCreationExpressionQualified() {
+    // ClassInstanceCreationExpression ::= Primary '.' 'new' SimpleName '(' ArgumentListopt ')' ClassBodyopt
+    // ClassInstanceCreationExpression ::= ClassInstanceCreationExpressionName 'new' SimpleName '(' ArgumentListopt ')' ClassBodyopt
+
+    classInstanceCreation(true); //  <-- push the Qualifed....
+
+    expressionLengthPtr--;
+    QualifiedAllocationExpression qae = (QualifiedAllocationExpression) expressionStack[expressionPtr--];
+    qae.enclosingInstance = expressionStack[expressionPtr];
+    expressionStack[expressionPtr] = qae;
+    qae.sourceStart = qae.enclosingInstance.sourceStart;
+  }
+  protected void consumeClassTypeElt() {
+    // ClassTypeElt ::= ClassType
+    pushOnAstStack(getTypeReference(0));
+    /* if incomplete thrown exception list, listLength counter will not have been reset,
+       indicating that some items are available on the stack */
+    listLength++;
+  }
+  protected void consumeClassTypeList() {
+    // ClassTypeList ::= ClassTypeList ',' ClassTypeElt
+    optimizedConcatNodeLists();
+  }
+  protected void consumeCompilationUnit() {
+    // CompilationUnit ::= EnterCompilationUnit PackageDeclarationopt ImportDeclarationsopt
+    // do nothing by default
+  }
+  protected void consumeConditionalExpression(int op) {
+    // ConditionalExpression ::= ConditionalOrExpression '?' Expression ':' ConditionalExpression
+    //optimize the push/pop
+
+    expressionPtr -= 2;
+    expressionLengthPtr -= 2;
+    expressionStack[expressionPtr] =
+      new ConditionalExpression(
+        expressionStack[expressionPtr],
+        expressionStack[expressionPtr + 1],
+        expressionStack[expressionPtr + 2]);
+  }
+  protected void consumeConstructorBlockStatements() {
+    // ConstructorBody ::= NestedMethod '{' ExplicitConstructorInvocation BlockStatements '}'
+    concatNodeLists(); // explictly add the first statement into the list of statements 
+  }
+  protected void consumeConstructorBody() {
+    // ConstructorBody ::= NestedMethod  '{' BlockStatementsopt '}'
+    // ConstructorBody ::= NestedMethod  '{' ExplicitConstructorInvocation '}'
+    nestedMethod[nestedType]--;
+  }
+  protected void consumeConstructorDeclaration() {
+    // ConstructorDeclaration ::= ConstructorHeader ConstructorBody
+
+    /*
+    astStack : MethodDeclaration statements
+    identifierStack : name
+     ==>
+    astStack : MethodDeclaration
+    identifierStack :
+    */
+
+    //must provide a default constructor call when needed
+
+    int length;
+
+    // pop the position of the {  (body of the method) pushed in block decl
+    intPtr--;
+
+    //statements
+    realBlockPtr--;
+    ExplicitConstructorCall constructorCall = null;
+    Statement[] statements = null;
+    if ((length = astLengthStack[astLengthPtr--]) != 0) {
+      astPtr -= length;
+      if (astStack[astPtr + 1] instanceof ExplicitConstructorCall) {
+        //avoid a isSomeThing that would only be used here BUT what is faster between two alternatives ?
+        System.arraycopy(astStack, astPtr + 2, statements = new Statement[length - 1], 0, length - 1);
+        constructorCall = (ExplicitConstructorCall) astStack[astPtr + 1];
+      } else { //need to add explicitly the super();
+        System.arraycopy(astStack, astPtr + 1, statements = new Statement[length], 0, length);
+        constructorCall = SuperReference.implicitSuperConstructorCall();
+      }
+    } else {
+      if (!diet) {
+        // add it only in non-diet mode, if diet_bodies, then constructor call will be added elsewhere.
+        constructorCall = SuperReference.implicitSuperConstructorCall();
+      }
+    }
+
+    // now we know that the top of stack is a constructorDeclaration
+    ConstructorDeclaration cd = (ConstructorDeclaration) astStack[astPtr];
+    cd.constructorCall = constructorCall;
+    cd.statements = statements;
+
+    //highlight of the implicit call on the method name
+    if (constructorCall != null && cd.constructorCall.sourceEnd == 0) {
+      cd.constructorCall.sourceEnd = cd.sourceEnd;
+      cd.constructorCall.sourceStart = cd.sourceStart;
+    }
+
+    //watch for } that could be given as a unicode ! ( u007D is '}' )
+    // store the endPosition (position just before the '}') in case there is
+    // a trailing comment behind the end of the method
+    cd.bodyEnd = endPosition;
+    cd.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition);
+  }
+
+  protected void consumeInvalidConstructorDeclaration() {
+    // ConstructorDeclaration ::= ConstructorHeader ';'
+    // now we know that the top of stack is a constructorDeclaration
+    ConstructorDeclaration cd = (ConstructorDeclaration) astStack[astPtr];
+
+    cd.bodyEnd = endPosition; // position just before the trailing semi-colon
+    cd.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition);
+    // report the problem and continue the parsing - narrowing the problem onto the method
+  }
+  protected void consumeConstructorHeader() {
+    // ConstructorHeader ::= ConstructorHeaderName MethodHeaderParameters MethodHeaderThrowsClauseopt
+
+    AbstractMethodDeclaration method = (AbstractMethodDeclaration) astStack[astPtr];
+
+    if (currentToken == TokenNameLBRACE) {
+      method.bodyStart = scanner.currentPosition;
+    }
+    // recovery
+    if (currentElement != null) {
+      restartRecovery = true; // used to avoid branching back into the regular automaton
+    }
+  }
+  protected void consumeConstructorHeaderName() {
+
+    /* recovering - might be an empty message send */
+    if (currentElement != null) {
+      if (lastIgnoredToken == TokenNamenew) { // was an allocation expression
+        lastCheckPoint = scanner.startPosition; // force to restart at this exact position                             
+        restartRecovery = true;
+        return;
+      }
+    }
+
+    // ConstructorHeaderName ::=  Modifiersopt 'Identifier' '('
+    ConstructorDeclaration cd = new ConstructorDeclaration(this.compilationUnit.compilationResult);
+
+    //name -- this is not really revelant but we do .....
+    cd.selector = identifierStack[identifierPtr];
+    long selectorSource = identifierPositionStack[identifierPtr--];
+    identifierLengthPtr--;
+
+    //modifiers
+    cd.declarationSourceStart = intStack[intPtr--];
+    cd.modifiers = intStack[intPtr--];
+
+    //highlight starts at the selector starts
+    cd.sourceStart = (int) (selectorSource >>> 32);
+    pushOnAstStack(cd);
+    cd.sourceEnd = lParenPos;
+    cd.bodyStart = lParenPos + 1;
+    listLength = 0; // initialize listLength before reading parameters/throws
+
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = cd.bodyStart;
+      if ((currentElement instanceof RecoveredType && lastIgnoredToken != TokenNameDOT) || cd.modifiers != 0) {
+        currentElement = currentElement.add(cd, 0);
+        lastIgnoredToken = -1;
+      }
+    }
+  }
+  protected void consumeDefaultLabel() {
+    // SwitchLabel ::= 'default' ':'
+    pushOnAstStack(new DefaultCase(intStack[intPtr--], intStack[intPtr--]));
+  }
+  protected void consumeDefaultModifiers() {
+    checkAnnotation(); // might update modifiers with AccDeprecated
+    pushOnIntStack(modifiers); // modifiers
+    pushOnIntStack(modifiersSourceStart >= 0 ? modifiersSourceStart : scanner.startPosition);
+    resetModifiers();
+  }
+  protected void consumeDiet() {
+    // Diet ::= $empty
+    checkAnnotation();
+    pushOnIntStack(modifiersSourceStart); // push the start position of a javadoc comment if there is one
+    jumpOverMethodBody();
+  }
+  protected void consumeDims() {
+    // Dims ::= DimsLoop
+    pushOnIntStack(dimensions);
+    dimensions = 0;
+  }
+  protected void consumeDimWithOrWithOutExpr() {
+    // DimWithOrWithOutExpr ::= '[' ']'
+    pushOnExpressionStack(null);
+  }
+  protected void consumeDimWithOrWithOutExprs() {
+    // DimWithOrWithOutExprs ::= DimWithOrWithOutExprs DimWithOrWithOutExpr
+    concatExpressionLists();
+  }
+  protected void consumeEmptyArgumentListopt() {
+    // ArgumentListopt ::= $empty
+    pushOnExpressionStackLengthStack(0);
+  }
+  protected void consumeEmptyArrayInitializer() {
+    // ArrayInitializer ::= '{' ,opt '}'
+    arrayInitializer(0);
+  }
+  protected void consumeEmptyArrayInitializeropt() {
+    // ArrayInitializeropt ::= $empty
+    pushOnExpressionStackLengthStack(0);
+  }
+  protected void consumeEmptyBlockStatementsopt() {
+    // BlockStatementsopt ::= $empty
+    pushOnAstLengthStack(0);
+  }
+  protected void consumeEmptyCatchesopt() {
+    // Catchesopt ::= $empty
+    pushOnAstLengthStack(0);
+  }
+  protected void consumeEmptyClassBodyDeclarationsopt() {
+    // ClassBodyDeclarationsopt ::= $empty
+    pushOnAstLengthStack(0);
+  }
+  protected void consumeEmptyClassMemberDeclaration() {
+    // ClassMemberDeclaration ::= ';'
+    pushOnAstLengthStack(0);
+  }
+  protected void consumeEmptyDimsopt() {
+    // Dimsopt ::= $empty
+    pushOnIntStack(0);
+  }
+  protected void consumeEmptyExpression() {
+    // Expressionopt ::= $empty
+    pushOnExpressionStackLengthStack(0);
+  }
+  protected void consumeEmptyForInitopt() {
+    // ForInitopt ::= $empty
+    pushOnAstLengthStack(0);
+  }
+  protected void consumeEmptyForUpdateopt() {
+    // ForUpdateopt ::= $empty
+    pushOnExpressionStackLengthStack(0);
+  }
+  protected void consumeEmptyImportDeclarationsopt() {
+    // ImportDeclarationsopt ::= $empty
+    pushOnAstLengthStack(0);
+  }
+  protected void consumeEmptyInterfaceMemberDeclaration() {
+    // InterfaceMemberDeclaration ::= ';'
+    pushOnAstLengthStack(0);
+  }
+  protected void consumeEmptyInterfaceMemberDeclarationsopt() {
+    // InterfaceMemberDeclarationsopt ::= $empty
+    pushOnAstLengthStack(0);
+  }
+  protected void consumeEmptyStatement() {
+    // EmptyStatement ::= ';'
+    if (this.scanner.source[endStatementPosition] == ';') {
+      pushOnAstStack(new EmptyStatement(endStatementPosition, endStatementPosition));
+    } else {
+      // we have a Unicode for the ';' (/u003B)
+      pushOnAstStack(new EmptyStatement(endStatementPosition - 5, endStatementPosition));
+    }
+  }
+  protected void consumeEmptySwitchBlock() {
+    // SwitchBlock ::= '{' '}'
+    pushOnAstLengthStack(0);
+  }
+  protected void consumeEmptyTypeDeclaration() {
+    // TypeDeclaration ::= ';' 
+    pushOnAstLengthStack(0);
+  }
+  protected void consumeEmptyTypeDeclarationsopt() {
+    // TypeDeclarationsopt ::= $empty
+    pushOnAstLengthStack(0);
+  }
+  protected void consumeEnterAnonymousClassBody() {
+    // EnterAnonymousClassBody ::= $empty
+    QualifiedAllocationExpression alloc;
+    AnonymousLocalTypeDeclaration anonymousType = new AnonymousLocalTypeDeclaration(this.compilationUnit.compilationResult);
+    alloc = anonymousType.allocation = new QualifiedAllocationExpression(anonymousType);
+    markCurrentMethodWithLocalType();
+    pushOnAstStack(anonymousType);
+
+    alloc.sourceEnd = rParenPos; //the position has been stored explicitly
+    int argumentLength;
+    if ((argumentLength = expressionLengthStack[expressionLengthPtr--]) != 0) {
+      expressionPtr -= argumentLength;
+      System.arraycopy(expressionStack, expressionPtr + 1, alloc.arguments = new Expression[argumentLength], 0, argumentLength);
+    }
+    alloc.type = getTypeReference(0);
+
+    anonymousType.sourceEnd = alloc.sourceEnd;
+    //position at the type while it impacts the anonymous declaration
+    anonymousType.sourceStart = anonymousType.declarationSourceStart = alloc.type.sourceStart;
+    alloc.sourceStart = intStack[intPtr--];
+    pushOnExpressionStack(alloc);
+
+    anonymousType.bodyStart = scanner.currentPosition;
+    listLength = 0; // will be updated when reading super-interfaces
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = anonymousType.bodyStart;
+      // the recoveryTokenCheck will deal with the open brace          
+      currentElement = currentElement.add(anonymousType, 0);
+      currentToken = 0; // opening brace already taken into account
+      lastIgnoredToken = -1;
+    }
+  }
+  protected void consumeEnterCompilationUnit() {
+    // EnterCompilationUnit ::= $empty
+    // do nothing by default
+  }
+  protected void consumeEnterVariable() {
+    // EnterVariable ::= $empty
+    // do nothing by default
+
+    char[] name = identifierStack[identifierPtr];
+    long namePosition = identifierPositionStack[identifierPtr];
+    int extendedDimension = intStack[intPtr--];
+    AbstractVariableDeclaration declaration;
+    // create the ast node
+    boolean isLocalDeclaration = nestedMethod[nestedType] != 0;
+    if (isLocalDeclaration) {
+      // create the local variable declarations
+      declaration = this.createLocalDeclaration(null, name, (int) (namePosition >>> 32), (int) namePosition);
+    } else {
+      // create the field declaration
+      declaration = this.createFieldDeclaration(null, name, (int) (namePosition >>> 32), (int) namePosition);
+    }
+
+    identifierPtr--;
+    identifierLengthPtr--;
+    TypeReference type;
+    int variableIndex = variablesCounter[nestedType];
+    int typeDim = 0;
+    if (variableIndex == 0) {
+      // first variable of the declaration (FieldDeclaration or LocalDeclaration)
+      if (isLocalDeclaration) {
+        declaration.declarationSourceStart = intStack[intPtr--];
+        declaration.modifiers = intStack[intPtr--];
+        type = getTypeReference(typeDim = intStack[intPtr--]); // type dimension
+        if (declaration.declarationSourceStart == -1) {
+          // this is true if there is no modifiers for the local variable declaration
+          declaration.declarationSourceStart = type.sourceStart;
+        }
+        pushOnAstStack(type);
+      } else {
+        type = getTypeReference(typeDim = intStack[intPtr--]); // type dimension
+        pushOnAstStack(type);
+        declaration.declarationSourceStart = intStack[intPtr--];
+        declaration.modifiers = intStack[intPtr--];
+      }
+    } else {
+      type = (TypeReference) astStack[astPtr - variableIndex];
+      typeDim = type.dimensions();
+      AbstractVariableDeclaration previousVariable = (AbstractVariableDeclaration) astStack[astPtr];
+      declaration.declarationSourceStart = previousVariable.declarationSourceStart;
+      declaration.modifiers = previousVariable.modifiers;
+    }
+
+    if (extendedDimension == 0) {
+      declaration.type = type;
+    } else {
+      int dimension = typeDim + extendedDimension;
+      //on the identifierLengthStack there is the information about the type....
+      int baseType;
+      if ((baseType = identifierLengthStack[identifierLengthPtr + 1]) < 0) {
+        //it was a baseType
+        int typeSourceStart = type.sourceStart;
+        int typeSourceEnd = type.sourceEnd;
+        type = TypeReference.baseTypeReference(-baseType, dimension);
+        type.sourceStart = typeSourceStart;
+        type.sourceEnd = typeSourceEnd;
+        declaration.type = type;
+      } else {
+        declaration.type = this.copyDims(type, dimension);
+      }
+    }
+    variablesCounter[nestedType]++;
+    pushOnAstStack(declaration);
+    // recovery
+    if (currentElement != null) {
+      if (!(currentElement instanceof RecoveredType)
+        && (currentToken == TokenNameDOT //|| declaration.modifiers != 0
+          || (scanner.getLineNumber(declaration.type.sourceStart) != scanner.getLineNumber((int) (namePosition >>> 32))))) {
+        lastCheckPoint = (int) (namePosition >>> 32);
+        restartRecovery = true;
+        return;
+      }
+      if (isLocalDeclaration) {
+        LocalDeclaration localDecl = (LocalDeclaration) astStack[astPtr];
+        lastCheckPoint = localDecl.sourceEnd + 1;
+        currentElement = currentElement.add(localDecl, 0);
+      } else {
+        FieldDeclaration fieldDecl = (FieldDeclaration) astStack[astPtr];
+        lastCheckPoint = fieldDecl.sourceEnd + 1;
+        currentElement = currentElement.add(fieldDecl, 0);
+      }
+      lastIgnoredToken = -1;
+    }
+  }
+  protected void consumeEqualityExpression(int op) {
+    // EqualityExpression ::= EqualityExpression '==' RelationalExpression
+    // EqualityExpression ::= EqualityExpression '!=' RelationalExpression
+
+    //optimize the push/pop
+
+    expressionPtr--;
+    expressionLengthPtr--;
+    expressionStack[expressionPtr] = new EqualExpression(expressionStack[expressionPtr], expressionStack[expressionPtr + 1], op);
+  }
+  protected void consumeExitVariableWithInitialization() {
+    // ExitVariableWithInitialization ::= $empty
+    // do nothing by default
+    expressionLengthPtr--;
+    AbstractVariableDeclaration variableDecl = (AbstractVariableDeclaration) astStack[astPtr];
+    variableDecl.initialization = expressionStack[expressionPtr--];
+    // we need to update the declarationSourceEnd of the local variable declaration to the
+    // source end position of the initialization expression
+    variableDecl.declarationSourceEnd = variableDecl.initialization.sourceEnd;
+    variableDecl.declarationEnd = variableDecl.initialization.sourceEnd;
+  }
+  protected void consumeExitVariableWithoutInitialization() {
+    // ExitVariableWithoutInitialization ::= $empty
+    // do nothing by default
+  }
+  protected void consumeExplicitConstructorInvocation(int flag, int recFlag) {
+
+    /* flag allows to distinguish 3 cases :
+    (0) :   
+    ExplicitConstructorInvocation ::= 'this' '(' ArgumentListopt ')' ';'
+    ExplicitConstructorInvocation ::= 'super' '(' ArgumentListopt ')' ';'
+    (1) :
+    ExplicitConstructorInvocation ::= Primary '.' 'super' '(' ArgumentListopt ')' ';'
+    ExplicitConstructorInvocation ::= Primary '.' 'this' '(' ArgumentListopt ')' ';'
+    (2) :
+    ExplicitConstructorInvocation ::= Name '.' 'super' '(' ArgumentListopt ')' ';'
+    ExplicitConstructorInvocation ::= Name '.' 'this' '(' ArgumentListopt ')' ';'
+    */
+    int startPosition = intStack[intPtr--];
+    ExplicitConstructorCall ecc = new ExplicitConstructorCall(recFlag);
+    int length;
+    if ((length = expressionLengthStack[expressionLengthPtr--]) != 0) {
+      expressionPtr -= length;
+      System.arraycopy(expressionStack, expressionPtr + 1, ecc.arguments = new Expression[length], 0, length);
+    }
+    switch (flag) {
+      case 0 :
+        ecc.sourceStart = startPosition;
+        break;
+      case 1 :
+        expressionLengthPtr--;
+        ecc.sourceStart = (ecc.qualification = expressionStack[expressionPtr--]).sourceStart;
+        break;
+      case 2 :
+        ecc.sourceStart = (ecc.qualification = getUnspecifiedReferenceOptimized()).sourceStart;
+        break;
     };
-    
-       public  static short check_table[] = null;
-       public  static char lhs[] =  null;
-       public  static char action[] = lhs;
-       private final static String FILEPREFIX = "parser"; //$NON-NLS-1$
-
-       static {
-               try{
-                       initTables();
-               } catch(java.io.IOException ex){
-                       throw new ExceptionInInitializerError(ex.getMessage());
-               }
-       }
-
-       public static final int RoundBracket = 0;
-       public static final int SquareBracket = 1;
-       public static final int CurlyBracket = 2;
-       public static final int BracketKinds = 3;
-
-public Parser(ProblemReporter problemReporter, boolean optimizeStringLiterals, boolean assertMode) {
-               
-       this.problemReporter = problemReporter;
-       this.optimizeStringLiterals = optimizeStringLiterals;
-       this.assertMode = assertMode;
-       this.initializeScanner();
-       astLengthStack = new int[50];
-       expressionLengthStack = new int[30];
-       intStack = new int[50];
-       identifierStack = new char[30][];
-       identifierLengthStack = new int[30];
-       nestedMethod = new int[30];
-       realBlockStack = new int[30];
-       identifierPositionStack = new long[30];
-       variablesCounter = new int[30];
-}
-/**
- *
- * INTERNAL USE-ONLY
- */
-protected void adjustInterfaceModifiers() {
-       intStack[intPtr - 1] |= AccInterface;
-}
-public final void arrayInitializer(int length) {
-       //length is the size of the array Initializer
-       //expressionPtr points on the last elt of the arrayInitializer
-       //i.e. it has not been decremented yet.
-
-       ArrayInitializer ai = new ArrayInitializer();
-       if (length != 0) {
-               expressionPtr -= length;
-               System.arraycopy(expressionStack, expressionPtr + 1, ai.expressions = new Expression[length], 0, length);
-       }
-       pushOnExpressionStack(ai);
-       //positionning
-       ai.sourceEnd = endStatementPosition;
-       int searchPosition = length == 0 ? endPosition : ai.expressions[0].sourceStart;
-       try {
-               //does not work with comments(that contain '{') nor '{' describes as a unicode....              
-               while (scanner.source[--searchPosition] != '{') {
-               }
-       } catch (IndexOutOfBoundsException ex) {
-               //should never occur (except for strange cases like whose describe above)
-               searchPosition = (length == 0 ? endPosition : ai.expressions[0].sourceStart) - 1;
-       }
-       ai.sourceStart = searchPosition;
-}
-protected static int asi(int state) {
+    pushOnAstStack(ecc);
+    ecc.sourceEnd = endPosition;
+  }
+  protected void consumeExpressionStatement() {
+    // ExpressionStatement ::= StatementExpression ';'
+    expressionLengthPtr--;
+    pushOnAstStack(expressionStack[expressionPtr--]);
+  }
+  protected void consumeFieldAccess(boolean isSuperAccess) {
+    // FieldAccess ::= Primary '.' 'Identifier'
+    // FieldAccess ::= 'super' '.' 'Identifier'
+
+    FieldReference fr = new FieldReference(identifierStack[identifierPtr], identifierPositionStack[identifierPtr--]);
+    identifierLengthPtr--;
+    if (isSuperAccess) {
+      //considerates the fieldReference beginning at the 'super' ....  
+      fr.sourceStart = intStack[intPtr--];
+      fr.receiver = new SuperReference(fr.sourceStart, endPosition);
+      pushOnExpressionStack(fr);
+    } else {
+      //optimize push/pop
+      if ((fr.receiver = expressionStack[expressionPtr]).isThis()) {
+        //fieldreference begins at the this
+        fr.sourceStart = fr.receiver.sourceStart;
+      }
+      expressionStack[expressionPtr] = fr;
+    }
+  }
+  protected void consumeFieldDeclaration() {
+    // See consumeLocalVariableDeclarationDefaultModifier() in case of change: duplicated code
+    // FieldDeclaration ::= Modifiersopt Type VariableDeclarators ';'
+
+    /*
+    astStack : 
+    expressionStack: Expression Expression ...... Expression
+    identifierStack : type  identifier identifier ...... identifier
+    intStack : typeDim      dim        dim               dim
+     ==>
+    astStack : FieldDeclaration FieldDeclaration ...... FieldDeclaration
+    expressionStack :
+    identifierStack : 
+    intStack : 
+      
+    */
+    int variableDeclaratorsCounter = astLengthStack[astLengthPtr];
+
+    for (int i = variableDeclaratorsCounter - 1; i >= 0; i--) {
+      FieldDeclaration fieldDeclaration = (FieldDeclaration) astStack[astPtr - i];
+      fieldDeclaration.declarationSourceEnd = endStatementPosition;
+      fieldDeclaration.declarationEnd = endStatementPosition; // semi-colon included
+    }
+    updateSourceDeclarationParts(variableDeclaratorsCounter);
+    int endPos = flushAnnotationsDefinedPriorTo(endStatementPosition);
+    if (endPos != endStatementPosition) {
+      for (int i = 0; i < variableDeclaratorsCounter; i++) {
+        FieldDeclaration fieldDeclaration = (FieldDeclaration) astStack[astPtr - i];
+        fieldDeclaration.declarationSourceEnd = endPos;
+      }
+    }
+    // update the astStack, astPtr and astLengthStack
+    int startIndex = astPtr - variablesCounter[nestedType] + 1;
+    System.arraycopy(astStack, startIndex, astStack, startIndex - 1, variableDeclaratorsCounter);
+    astPtr--; // remove the type reference
+    astLengthStack[--astLengthPtr] = variableDeclaratorsCounter;
+
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = endPos + 1;
+      if (currentElement.parent != null && currentElement instanceof RecoveredField) {
+        currentElement = currentElement.parent;
+      }
+      restartRecovery = true;
+    }
+    variablesCounter[nestedType] = 0;
+  }
+  protected void consumeForceNoDiet() {
+    // ForceNoDiet ::= $empty
+    dietInt++;
+  }
+  protected void consumeForInit() {
+    // ForInit ::= StatementExpressionList
+    pushOnAstLengthStack(-1);
+  }
+  protected void consumeFormalParameter() {
+    // FormalParameter ::= Type VariableDeclaratorId ==> false
+    // FormalParameter ::= Modifiers Type VariableDeclaratorId ==> true
+    /*
+    astStack : 
+    identifierStack : type identifier
+    intStack : dim dim
+     ==>
+    astStack : Argument
+    identifierStack :  
+    intStack :  
+    */
+
+    identifierLengthPtr--;
+    char[] name = identifierStack[identifierPtr];
+    long namePositions = identifierPositionStack[identifierPtr--];
+    TypeReference type = getTypeReference(intStack[intPtr--] + intStack[intPtr--]);
+    int modifierPositions = intStack[intPtr--];
+    intPtr--;
+    Argument arg = new Argument(name, namePositions, type, intStack[intPtr + 1] & ~AccDeprecated); // modifiers
+    arg.declarationSourceStart = modifierPositions;
+    pushOnAstStack(arg);
+
+    /* if incomplete method header, listLength counter will not have been reset,
+       indicating that some arguments are available on the stack */
+    listLength++;
+  }
+  protected void consumeFormalParameterList() {
+    // FormalParameterList ::= FormalParameterList ',' FormalParameter
+    optimizedConcatNodeLists();
+  }
+  protected void consumeFormalParameterListopt() {
+    // FormalParameterListopt ::= $empty
+    pushOnAstLengthStack(0);
+  }
+  protected void consumeImportDeclarations() {
+    // ImportDeclarations ::= ImportDeclarations ImportDeclaration 
+    optimizedConcatNodeLists();
+  }
+  protected void consumeImportDeclarationsopt() {
+    // ImportDeclarationsopt ::= ImportDeclarations
+    int length;
+    if ((length = astLengthStack[astLengthPtr--]) != 0) {
+      astPtr -= length;
+      System.arraycopy(astStack, astPtr + 1, compilationUnit.imports = new ImportReference[length], 0, length);
+    }
+  }
+  protected void consumeInstanceOfExpression(int op) {
+    // RelationalExpression ::= RelationalExpression 'instanceof' ReferenceType
+    //optimize the push/pop
+
+    //by construction, no base type may be used in getTypeReference
+    Expression exp;
+    expressionStack[expressionPtr] =
+      exp = new InstanceOfExpression(expressionStack[expressionPtr], getTypeReference(intStack[intPtr--]), op);
+    if (exp.sourceEnd == 0) {
+      //array on base type....
+      exp.sourceEnd = scanner.startPosition - 1;
+    }
+    //the scanner is on the next token already....
+  }
+  protected void consumeInterfaceDeclaration() {
+    // see consumeClassDeclaration in case of changes: duplicated code
+    // InterfaceDeclaration ::= InterfaceHeader InterfaceBody
+    int length;
+    if ((length = astLengthStack[astLengthPtr--]) != 0) {
+      //there are length declarations
+      //dispatch.....according to the type of the declarations
+      dispatchDeclarationInto(length);
+    }
+
+    TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
+
+    // mark fields and initializer with local type mark if needed
+    markFieldsWithLocalType(typeDecl);
+
+    //convert constructor that do not have the type's name into methods
+    typeDecl.checkConstructors(this);
+
+    //always add <clinit> (will be remove at code gen time if empty)
+    if (this.scanner.containsAssertKeyword) {
+      typeDecl.bits |= AstNode.AddAssertionMASK;
+    }
+    typeDecl.addClinit();
+    typeDecl.bodyEnd = endStatementPosition;
+    typeDecl.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition);
+  }
+  protected void consumeInterfaceHeader() {
+    // InterfaceHeader ::= InterfaceHeaderName InterfaceHeaderExtendsopt
+
+    TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
+    if (currentToken == TokenNameLBRACE) {
+      typeDecl.bodyStart = scanner.currentPosition;
+    }
+    if (currentElement != null) {
+      restartRecovery = true; // used to avoid branching back into the regular automaton               
+    }
+    // flush the comments related to the interface header
+    scanner.commentPtr = -1;
+  }
+  protected void consumeInterfaceHeaderExtends() {
+    // InterfaceHeaderExtends ::= 'extends' InterfaceTypeList
+    int length = astLengthStack[astLengthPtr--];
+    //super interfaces
+    astPtr -= length;
+    TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
+    System.arraycopy(astStack, astPtr + 1, typeDecl.superInterfaces = new TypeReference[length], 0, length);
+    typeDecl.bodyStart = typeDecl.superInterfaces[length - 1].sourceEnd + 1;
+    listLength = 0; // reset after having read super-interfaces                
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = typeDecl.bodyStart;
+    }
+  }
+  protected void consumeInterfaceHeaderName() {
+    // InterfaceHeaderName ::= Modifiersopt 'interface' 'Identifier'
+    TypeDeclaration typeDecl;
+    if (nestedMethod[nestedType] == 0) {
+      if (nestedType != 0) {
+        typeDecl = new MemberTypeDeclaration(this.compilationUnit.compilationResult);
+      } else {
+        typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult);
+      }
+    } else {
+      // Record that the block has a declaration for local types
+      typeDecl = new LocalTypeDeclaration(this.compilationUnit.compilationResult);
+      markCurrentMethodWithLocalType();
+      blockReal();
+    }
+
+    //highlight the name of the type
+    long pos = identifierPositionStack[identifierPtr];
+    typeDecl.sourceEnd = (int) pos;
+    typeDecl.sourceStart = (int) (pos >>> 32);
+    typeDecl.name = identifierStack[identifierPtr--];
+    identifierLengthPtr--;
+
+    //compute the declaration source too
+    // 'class' and 'interface' push two int positions: the beginning of the class token and its end.
+    // we want to keep the beginning position but get rid of the end position
+    // it is only used for the ClassLiteralAccess positions.
+    typeDecl.declarationSourceStart = intStack[intPtr--];
+    intPtr--; // remove the end position of the class token
+    typeDecl.modifiersSourceStart = intStack[intPtr--];
+    typeDecl.modifiers = intStack[intPtr--];
+    if (typeDecl.modifiersSourceStart >= 0) {
+      typeDecl.declarationSourceStart = typeDecl.modifiersSourceStart;
+    }
+    typeDecl.bodyStart = typeDecl.sourceEnd + 1;
+    pushOnAstStack(typeDecl);
+    listLength = 0; // will be updated when reading super-interfaces
+    // recovery
+    if (currentElement != null) { // is recovering
+      lastCheckPoint = typeDecl.bodyStart;
+      currentElement = currentElement.add(typeDecl, 0);
+      lastIgnoredToken = -1;
+    }
+  }
+  protected void consumeInterfaceMemberDeclarations() {
+    // InterfaceMemberDeclarations ::= InterfaceMemberDeclarations InterfaceMemberDeclaration
+    concatNodeLists();
+  }
+  protected void consumeInterfaceMemberDeclarationsopt() {
+    // InterfaceMemberDeclarationsopt ::= NestedType InterfaceMemberDeclarations
+    nestedType--;
+  }
+  protected void consumeInterfaceType() {
+    // InterfaceType ::= ClassOrInterfaceType
+    pushOnAstStack(getTypeReference(0));
+    /* if incomplete type header, listLength counter will not have been reset,
+       indicating that some interfaces are available on the stack */
+    listLength++;
+  }
+  protected void consumeInterfaceTypeList() {
+    // InterfaceTypeList ::= InterfaceTypeList ',' InterfaceType
+    optimizedConcatNodeLists();
+  }
+  protected void consumeLeftHandSide() {
+    // LeftHandSide ::= Name
+
+    pushOnExpressionStack(getUnspecifiedReferenceOptimized());
+  }
+  protected void consumeLeftParen() {
+    // PushLPAREN ::= '('
+    pushOnIntStack(lParenPos);
+  }
+  protected void consumeLocalVariableDeclaration() {
+    // LocalVariableDeclaration ::= Modifiers Type VariableDeclarators ';'
+
+    /*
+    astStack : 
+    expressionStack: Expression Expression ...... Expression
+    identifierStack : type  identifier identifier ...... identifier
+    intStack : typeDim      dim        dim               dim
+     ==>
+    astStack : FieldDeclaration FieldDeclaration ...... FieldDeclaration
+    expressionStack :
+    identifierStack : 
+    intStack : 
+      
+    */
+    int variableDeclaratorsCounter = astLengthStack[astLengthPtr];
+
+    // update the astStack, astPtr and astLengthStack
+    int startIndex = astPtr - variablesCounter[nestedType] + 1;
+    System.arraycopy(astStack, startIndex, astStack, startIndex - 1, variableDeclaratorsCounter);
+    astPtr--; // remove the type reference
+    astLengthStack[--astLengthPtr] = variableDeclaratorsCounter;
+    variablesCounter[nestedType] = 0;
+  }
+  protected void consumeLocalVariableDeclarationStatement() {
+    // LocalVariableDeclarationStatement ::= LocalVariableDeclaration ';'
+    // see blockReal in case of change: duplicated code
+    // increment the amount of declared variables for this block
+    realBlockStack[realBlockPtr]++;
+  }
+  protected void consumeMethodBody() {
+    // MethodBody ::= NestedMethod '{' BlockStatementsopt '}' 
+    nestedMethod[nestedType]--;
+  }
+  protected void consumeMethodDeclaration(boolean isNotAbstract) {
+    // MethodDeclaration ::= MethodHeader MethodBody
+    // AbstractMethodDeclaration ::= MethodHeader ';'
+
+    /*
+    astStack : modifiers arguments throws statements
+    identifierStack : type name
+    intStack : dim dim dim
+     ==>
+    astStack : MethodDeclaration
+    identifierStack :
+    intStack : 
+    */
+
+    int length;
+    if (isNotAbstract) {
+      // pop the position of the {  (body of the method) pushed in block decl
+      intPtr--;
+    }
+
+    int explicitDeclarations = 0;
+    Statement[] statements = null;
+    if (isNotAbstract) {
+      //statements
+      explicitDeclarations = realBlockStack[realBlockPtr--];
+      if ((length = astLengthStack[astLengthPtr--]) != 0)
+        System.arraycopy(astStack, (astPtr -= length) + 1, statements = new Statement[length], 0, length);
+    }
+
+    // now we know that we have a method declaration at the top of the ast stack
+    MethodDeclaration md = (MethodDeclaration) astStack[astPtr];
+    md.statements = statements;
+    md.explicitDeclarations = explicitDeclarations;
+
+    // cannot be done in consumeMethodHeader because we have no idea whether or not there
+    // is a body when we reduce the method header
+    if (!isNotAbstract) { //remember the fact that the method has a semicolon body
+      md.modifiers |= AccSemicolonBody;
+    }
+    // store the endPosition (position just before the '}') in case there is
+    // a trailing comment behind the end of the method
+    md.bodyEnd = endPosition;
+    md.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition);
+  }
+  protected void consumeMethodHeader() {
+    // MethodHeader ::= MethodHeaderName MethodHeaderParameters MethodHeaderExtendedDims ThrowsClauseopt
+    // retrieve end position of method declarator
+    AbstractMethodDeclaration method = (AbstractMethodDeclaration) astStack[astPtr];
+
+    if (currentToken == TokenNameLBRACE) {
+      method.bodyStart = scanner.currentPosition;
+    }
+    // recovery
+    if (currentElement != null) {
+      if (currentToken == TokenNameSEMICOLON) {
+        method.modifiers |= AccSemicolonBody;
+        method.declarationSourceEnd = scanner.currentPosition - 1;
+        method.bodyEnd = scanner.currentPosition - 1;
+        if (currentElement.parent != null) {
+          currentElement = currentElement.parent;
+        }
+      }
+      restartRecovery = true; // used to avoid branching back into the regular automaton
+    }
+  }
+  protected void consumeMethodHeaderExtendedDims() {
+    // MethodHeaderExtendedDims ::= Dimsopt
+    // now we update the returnType of the method
+    MethodDeclaration md = (MethodDeclaration) astStack[astPtr];
+    int extendedDims = intStack[intPtr--];
+    if (extendedDims != 0) {
+      TypeReference returnType = md.returnType;
+      md.sourceEnd = endPosition;
+      int dims = returnType.dimensions() + extendedDims;
+      int baseType;
+      if ((baseType = identifierLengthStack[identifierLengthPtr + 1]) < 0) {
+        //it was a baseType
+        int sourceStart = returnType.sourceStart;
+        int sourceEnd = returnType.sourceEnd;
+        returnType = TypeReference.baseTypeReference(-baseType, dims);
+        returnType.sourceStart = sourceStart;
+        returnType.sourceEnd = sourceEnd;
+        md.returnType = returnType;
+      } else {
+        md.returnType = this.copyDims(md.returnType, dims);
+      }
+      if (currentToken == TokenNameLBRACE) {
+        md.bodyStart = endPosition + 1;
+      }
+      // recovery
+      if (currentElement != null) {
+        lastCheckPoint = md.bodyStart;
+      }
+    }
+  }
+  protected void consumeMethodHeaderName() {
+    // MethodHeaderName ::= Modifiersopt Type 'Identifier' '('
+    MethodDeclaration md = new MethodDeclaration(this.compilationUnit.compilationResult);
+
+    //name
+    md.selector = identifierStack[identifierPtr];
+    long selectorSource = identifierPositionStack[identifierPtr--];
+    identifierLengthPtr--;
+    //type
+    md.returnType = getTypeReference(intStack[intPtr--]);
+    //modifiers
+    md.declarationSourceStart = intStack[intPtr--];
+    md.modifiers = intStack[intPtr--];
+
+    //highlight starts at selector start
+    md.sourceStart = (int) (selectorSource >>> 32);
+    pushOnAstStack(md);
+    md.sourceEnd = lParenPos;
+    md.bodyStart = lParenPos + 1;
+    listLength = 0; // initialize listLength before reading parameters/throws
+
+    // recovery
+    if (currentElement != null) {
+      if (currentElement instanceof RecoveredType //|| md.modifiers != 0
+        || (scanner.getLineNumber(md.returnType.sourceStart) == scanner.getLineNumber(md.sourceStart))) {
+        lastCheckPoint = md.bodyStart;
+        currentElement = currentElement.add(md, 0);
+        lastIgnoredToken = -1;
+      } else {
+        lastCheckPoint = md.sourceStart;
+        restartRecovery = true;
+      }
+    }
+  }
+  protected void consumeMethodHeaderParameters() {
+    // MethodHeaderParameters ::= FormalParameterListopt ')'
+    int length = astLengthStack[astLengthPtr--];
+    astPtr -= length;
+    AbstractMethodDeclaration md = (AbstractMethodDeclaration) astStack[astPtr];
+    md.sourceEnd = rParenPos;
+    //arguments
+    if (length != 0) {
+      System.arraycopy(astStack, astPtr + 1, md.arguments = new Argument[length], 0, length);
+    }
+    md.bodyStart = rParenPos + 1;
+    listLength = 0; // reset listLength after having read all parameters
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = md.bodyStart;
+      if (currentElement.parseTree() == md)
+        return;
+
+      // might not have been attached yet - in some constructor scenarii
+      if (md.isConstructor()) {
+        if ((length != 0) || (currentToken == TokenNameLBRACE) // || (currentToken == TokenNamethrows)
+        ) {
+          currentElement = currentElement.add(md, 0);
+          lastIgnoredToken = -1;
+        }
+      }
+    }
+  }
+  protected void consumeMethodHeaderThrowsClause() {
+    // MethodHeaderThrowsClause ::= 'throws' ClassTypeList
+    int length = astLengthStack[astLengthPtr--];
+    astPtr -= length;
+    AbstractMethodDeclaration md = (AbstractMethodDeclaration) astStack[astPtr];
+    System.arraycopy(astStack, astPtr + 1, md.thrownExceptions = new TypeReference[length], 0, length);
+    md.sourceEnd = md.thrownExceptions[length - 1].sourceEnd;
+    md.bodyStart = md.thrownExceptions[length - 1].sourceEnd + 1;
+    listLength = 0; // reset listLength after having read all thrown exceptions        
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = md.bodyStart;
+    }
+  }
+  protected void consumeMethodInvocationName() {
+    // MethodInvocation ::= Name '(' ArgumentListopt ')'
+
+    // when the name is only an identifier...we have a message send to "this" (implicit)
+
+    MessageSend m = newMessageSend();
+    m.sourceEnd = rParenPos;
+    m.sourceStart = (int) ((m.nameSourcePosition = identifierPositionStack[identifierPtr]) >>> 32);
+    m.selector = identifierStack[identifierPtr--];
+    if (identifierLengthStack[identifierLengthPtr] == 1) {
+      m.receiver = ThisReference.ThisImplicit;
+      identifierLengthPtr--;
+    } else {
+      identifierLengthStack[identifierLengthPtr]--;
+      m.receiver = getUnspecifiedReference();
+      m.sourceStart = m.receiver.sourceStart;
+    }
+    pushOnExpressionStack(m);
+  }
+  protected void consumeMethodInvocationPrimary() {
+    //optimize the push/pop
+    //MethodInvocation ::= Primary '.' 'Identifier' '(' ArgumentListopt ')'
+
+    MessageSend m = newMessageSend();
+    m.sourceStart = (int) ((m.nameSourcePosition = identifierPositionStack[identifierPtr]) >>> 32);
+    m.selector = identifierStack[identifierPtr--];
+    identifierLengthPtr--;
+    m.receiver = expressionStack[expressionPtr];
+    m.sourceStart = m.receiver.sourceStart;
+    m.sourceEnd = rParenPos;
+    expressionStack[expressionPtr] = m;
+  }
+  protected void consumeMethodInvocationSuper() {
+    // MethodInvocation ::= 'super' '.' 'Identifier' '(' ArgumentListopt ')'
+
+    MessageSend m = newMessageSend();
+    m.sourceStart = intStack[intPtr--];
+    m.sourceEnd = rParenPos;
+    m.nameSourcePosition = identifierPositionStack[identifierPtr];
+    m.selector = identifierStack[identifierPtr--];
+    identifierLengthPtr--;
+    m.receiver = new SuperReference(m.sourceStart, endPosition);
+    pushOnExpressionStack(m);
+  }
+  protected void consumeMethodPushModifiersHeaderName() {
+    // MethodPushModifiersHeaderName ::= Modifiers Type PushModifiers 'Identifier' '('
+    // MethodPushModifiersHeaderName ::= Type PushModifiers 'Identifier' '(' 
+    MethodDeclaration md = new MethodDeclaration(this.compilationUnit.compilationResult);
+
+    //name
+    md.selector = identifierStack[identifierPtr];
+    long selectorSource = identifierPositionStack[identifierPtr--];
+    identifierLengthPtr--;
+
+    //modifiers
+    md.declarationSourceStart = intStack[intPtr--];
+    md.modifiers = intStack[intPtr--];
+
+    //type
+    md.returnType = getTypeReference(intStack[intPtr--]);
+
+    //highlight starts at selector start
+    md.sourceStart = (int) (selectorSource >>> 32);
+    pushOnAstStack(md);
+    md.sourceEnd = lParenPos;
+    md.bodyStart = lParenPos + 1;
+    listLength = 0; // initialize listLength before reading parameters/throws
+
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = md.bodyStart;
+      currentElement = currentElement.add(md, 0);
+      lastIgnoredToken = -1;
+    }
+  }
+  protected void consumeModifiers() {
+    int savedModifiersSourceStart = modifiersSourceStart;
+    checkAnnotation(); // might update modifiers with AccDeprecated
+    pushOnIntStack(modifiers); // modifiers
+    if (modifiersSourceStart >= savedModifiersSourceStart) {
+      modifiersSourceStart = savedModifiersSourceStart;
+    }
+    pushOnIntStack(modifiersSourceStart);
+    resetModifiers();
+  }
+  protected void consumeNestedMethod() {
+    // NestedMethod ::= $empty
+    jumpOverMethodBody();
+    nestedMethod[nestedType]++;
+    consumeOpenBlock();
+  }
+  protected void consumeNestedType() {
+    // NestedType ::= $empty
+    nestedType++;
+    try {
+      nestedMethod[nestedType] = 0;
+    } catch (IndexOutOfBoundsException e) {
+      //except in test's cases, it should never raise
+      int oldL = nestedMethod.length;
+      System.arraycopy(nestedMethod, 0, (nestedMethod = new int[oldL + 30]), 0, oldL);
+      nestedMethod[nestedType] = 0;
+      // increase the size of the fieldsCounter as well. It has to be consistent with the size of the nestedMethod collection
+      System.arraycopy(variablesCounter, 0, (variablesCounter = new int[oldL + 30]), 0, oldL);
+    }
+    variablesCounter[nestedType] = 0;
+  }
+  protected void consumeOneDimLoop() {
+    // OneDimLoop ::= '[' ']'
+    dimensions++;
+  }
+  protected void consumeOnlySynchronized() {
+    // OnlySynchronized ::= 'synchronized'
+    pushOnIntStack(this.synchronizedBlockSourceStart);
+    resetModifiers();
+  }
+  protected void consumeOpenBlock() {
+    // OpenBlock ::= $empty
+
+    pushOnIntStack(scanner.startPosition);
+    try {
+      realBlockStack[++realBlockPtr] = 0;
+    } catch (IndexOutOfBoundsException e) {
+      //realBlockPtr is correct 
+      int oldStackLength = realBlockStack.length;
+      int oldStack[] = realBlockStack;
+      realBlockStack = new int[oldStackLength + StackIncrement];
+      System.arraycopy(oldStack, 0, realBlockStack, 0, oldStackLength);
+      realBlockStack[realBlockPtr] = 0;
+    }
+  }
+  protected void consumePackageDeclaration() {
+    // PackageDeclaration ::= 'package' Name ';'
+    /* build an ImportRef build from the last name 
+    stored in the identifier stack. */
+
+    ImportReference impt = compilationUnit.currentPackage;
+    // flush annotations defined prior to import statements
+    impt.declarationEnd = endStatementPosition;
+    impt.declarationSourceEnd = this.flushAnnotationsDefinedPriorTo(impt.declarationSourceEnd);
+  }
+  protected void consumePackageDeclarationName() {
+    // PackageDeclarationName ::= 'package' Name
+    /* build an ImportRef build from the last name 
+    stored in the identifier stack. */
+
+    ImportReference impt;
+    int length;
+    char[][] tokens = new char[length = identifierLengthStack[identifierLengthPtr--]][];
+    identifierPtr -= length;
+    long[] positions = new long[length];
+    System.arraycopy(identifierStack, ++identifierPtr, tokens, 0, length);
+    System.arraycopy(identifierPositionStack, identifierPtr--, positions, 0, length);
+    compilationUnit.currentPackage = impt = new ImportReference(tokens, positions, true);
+
+    if (currentToken == TokenNameSEMICOLON) {
+      impt.declarationSourceEnd = scanner.currentPosition - 1;
+    } else {
+      impt.declarationSourceEnd = impt.sourceEnd;
+    }
+    impt.declarationEnd = impt.declarationSourceEnd;
+    //endPosition is just before the ;
+    impt.declarationSourceStart = intStack[intPtr--];
+
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = impt.declarationSourceEnd + 1;
+      restartRecovery = true; // used to avoid branching back into the regular automaton               
+    }
+  }
+  protected void consumePostfixExpression() {
+    // PostfixExpression ::= Name
+    pushOnExpressionStack(getUnspecifiedReferenceOptimized());
+  }
+  protected void consumePrimaryNoNewArray() {
+    // PrimaryNoNewArray ::=  PushLPAREN Expression PushRPAREN 
+    updateSourcePosition(expressionStack[expressionPtr]);
+  }
+  protected void consumePrimaryNoNewArrayArrayType() {
+    // PrimaryNoNewArray ::= ArrayType '.' 'class'
+    intPtr--;
+    pushOnExpressionStack(new ClassLiteralAccess(intStack[intPtr--], getTypeReference(intStack[intPtr--])));
+  }
+  protected void consumePrimaryNoNewArrayName() {
+    // PrimaryNoNewArray ::= Name '.' 'class'
+    intPtr--;
+    pushOnExpressionStack(new ClassLiteralAccess(intStack[intPtr--], getTypeReference(0)));
+  }
+  protected void consumePrimaryNoNewArrayNameSuper() {
+    // PrimaryNoNewArray ::= Name '.' 'super'
+    pushOnExpressionStack(new QualifiedSuperReference(getTypeReference(0), intStack[intPtr--], endPosition));
+  }
+  protected void consumePrimaryNoNewArrayNameThis() {
+    // PrimaryNoNewArray ::= Name '.' 'this'
+    pushOnExpressionStack(new QualifiedThisReference(getTypeReference(0), intStack[intPtr--], endPosition));
+  }
+  protected void consumePrimaryNoNewArrayPrimitiveType() {
+    // PrimaryNoNewArray ::= PrimitiveType '.' 'class'
+    intPtr--;
+    pushOnExpressionStack(new ClassLiteralAccess(intStack[intPtr--], getTypeReference(0)));
+  }
+  protected void consumePrimaryNoNewArrayThis() {
+    // PrimaryNoNewArray ::= 'this'
+    pushOnExpressionStack(new ThisReference(intStack[intPtr--], endPosition));
+  }
+  protected void consumePrimitiveType() {
+    // Type ::= PrimitiveType
+    pushOnIntStack(0);
+  }
+  protected void consumePushModifiers() {
+    if ((modifiers & AccSynchronized) != 0) {
+      /* remove the starting position of the synchronized keyword
+       * we don't need it when synchronized is part of the modifiers
+       */
+      intPtr--;
+    }
+    pushOnIntStack(modifiers); // modifiers
+    pushOnIntStack(modifiersSourceStart);
+    resetModifiers();
+  }
+  protected void consumePushPosition() {
+    // for source managment purpose
+    // PushPosition ::= $empty
+    pushOnIntStack(endPosition);
+  }
+  protected void consumeQualifiedName() {
+    // QualifiedName ::= Name '.' SimpleName 
+    /*back from the recursive loop of QualifiedName.
+    Updates identifier length into the length stack*/
+
+    identifierLengthStack[--identifierLengthPtr]++;
+  }
+  protected void consumeReferenceType() {
+    // ReferenceType ::= ClassOrInterfaceType
+    pushOnIntStack(0);
+  }
+  protected void consumeRestoreDiet() {
+    // RestoreDiet ::= $empty
+    dietInt--;
+  }
+  protected void consumeRightParen() {
+    // PushRPAREN ::= ')'
+    pushOnIntStack(rParenPos);
+  }
+  // This method is part of an automatic generation : do NOT edit-modify  
+  // This method is part of an automatic generation : do NOT edit-modify  
+  protected void consumeRule(int act) {
+    switch (act) {
+      case 29 : // System.out.println("Type ::= PrimitiveType");
+        consumePrimitiveType();
+        break;
+
+      case 43 : // System.out.println("ReferenceType ::= ClassOrInterfaceType");
+        consumeReferenceType();
+        break;
+
+      case 52 : // System.out.println("QualifiedName ::= Name DOT SimpleName");
+        consumeQualifiedName();
+        break;
+
+      case 53 : // System.out.println("CompilationUnit ::= EnterCompilationUnit PackageDeclarationopt ImportDeclarationsopt");
+        consumeCompilationUnit();
+        break;
+
+      case 54 : // System.out.println("EnterCompilationUnit ::=");
+        consumeEnterCompilationUnit();
+        break;
+
+      case 66 : // System.out.println("CatchHeader ::= catch LPAREN FormalParameter RPAREN LBRACE");
+        consumeCatchHeader();
+        break;
+
+      case 68 : // System.out.println("ImportDeclarations ::= ImportDeclarations ImportDeclaration");
+        consumeImportDeclarations();
+        break;
+
+      case 70 : // System.out.println("TypeDeclarations ::= TypeDeclarations TypeDeclaration");
+        consumeTypeDeclarations();
+        break;
+
+      case 71 : // System.out.println("PackageDeclaration ::= PackageDeclarationName SEMICOLON");
+        consumePackageDeclaration();
+        break;
+
+      case 72 : // System.out.println("PackageDeclarationName ::= package Name");
+        consumePackageDeclarationName();
+        break;
+
+      case 75 : // System.out.println("SingleTypeImportDeclaration ::= SingleTypeImportDeclarationName SEMICOLON");
+        consumeSingleTypeImportDeclaration();
+        break;
+
+      case 76 : // System.out.println("SingleTypeImportDeclarationName ::= import Name");
+        consumeSingleTypeImportDeclarationName();
+        break;
+
+      case 77 : // System.out.println("TypeImportOnDemandDeclaration ::= TypeImportOnDemandDeclarationName SEMICOLON");
+        consumeTypeImportOnDemandDeclaration();
+        break;
+
+      case 78 : // System.out.println("TypeImportOnDemandDeclarationName ::= import Name DOT MULTIPLY");
+        consumeTypeImportOnDemandDeclarationName();
+        break;
+
+      case 81 : // System.out.println("TypeDeclaration ::= SEMICOLON");
+        consumeEmptyTypeDeclaration();
+        break;
+
+      case 95 : // System.out.println("ClassDeclaration ::= ClassHeader ClassBody");
+        consumeClassDeclaration();
+        break;
+
+      case 96 : // System.out.println("ClassHeader ::= ClassHeaderName ClassHeaderExtendsopt ClassHeaderImplementsopt");
+        consumeClassHeader();
+        break;
+
+      case 97 : // System.out.println("ClassHeaderName ::= Modifiersopt class Identifier");
+        consumeClassHeaderName();
+        break;
+
+      case 98 : // System.out.println("ClassHeaderExtends ::= extends ClassType");
+        consumeClassHeaderExtends();
+        break;
+
+      case 99 : // System.out.println("ClassHeaderImplements ::= implements InterfaceTypeList");
+        consumeClassHeaderImplements();
+        break;
+
+      case 101 : // System.out.println("InterfaceTypeList ::= InterfaceTypeList COMMA InterfaceType");
+        consumeInterfaceTypeList();
+        break;
+
+      case 102 : // System.out.println("InterfaceType ::= ClassOrInterfaceType");
+        consumeInterfaceType();
+        break;
+
+      case 105 : // System.out.println("ClassBodyDeclarations ::= ClassBodyDeclarations ClassBodyDeclaration");
+        consumeClassBodyDeclarations();
+        break;
+
+      case 109 : // System.out.println("ClassBodyDeclaration ::= Diet NestedMethod Block");
+        consumeClassBodyDeclaration();
+        break;
+
+      case 110 : // System.out.println("Diet ::=");
+        consumeDiet();
+        break;
+
+      case 111 : // System.out.println("Initializer ::= Diet NestedMethod Block");
+        consumeClassBodyDeclaration();
+        break;
 
-       return asb[original_state(state)];
-}
-protected void blockReal() {
-       // See consumeLocalVariableDeclarationStatement in case of change: duplicated code
-       // increment the amount of declared variables for this block
-       realBlockStack[realBlockPtr]++;
-}
-private final static void buildFileFor(String filename, String tag, String[] tokens, boolean isShort) throws java.io.IOException {
-
-       //transform the String tokens into chars before dumping then into file
-
-       int i = 0;
-       //read upto the tag
-       while (!tokens[i++].equals(tag)) {}
-       //read upto the }
-       char[] chars = new char[tokens.length]; //can't be bigger
-       int ic = 0;
-       String token;
-       while (!(token = tokens[i++]).equals("}")) { //$NON-NLS-1$
-               int c = Integer.parseInt(token);
-               if (isShort)
-                       c += 32768;
-               chars[ic++] = (char) c;
-       }
-
-       //resize
-       System.arraycopy(chars, 0, chars = new char[ic], 0, ic);
-
-       buildFileForTable(filename, chars);
-}
-private final static void buildFileForTable(String filename, char[] chars) throws java.io.IOException {
-
-       byte[] bytes = new byte[chars.length * 2];
-       for (int i = 0; i < chars.length; i++) {
-               bytes[2 * i] = (byte) (chars[i] >>> 8);
-               bytes[2 * i + 1] = (byte) (chars[i] & 0xFF);
-       }
-
-       java.io.FileOutputStream stream = new java.io.FileOutputStream(filename);
-       stream.write(bytes);
-       stream.close();
-       System.out.println(filename + " creation complete"); //$NON-NLS-1$
-}
-public final static void buildFilesFromLPG(String dataFilename)        throws java.io.IOException {
-
-       //RUN THIS METHOD TO GENERATE PARSER*.RSC FILES
-
-       //build from the lpg javadcl.java files that represents the parser tables
-       //lhs check_table asb asr symbol_index
-
-       //[org.eclipse.jdt.internal.compiler.parser.Parser.buildFilesFromLPG("d:/leapfrog/grammar/javadcl.java")]
-
-       char[] contents = new char[] {};
-       try {
-               contents = Util.getFileCharContent(new File(dataFilename), null);
-       } catch (IOException ex) {
-               System.out.println(Util.bind("parser.incorrectPath")); //$NON-NLS-1$
-               return;
-       }
-       java.util.StringTokenizer st = 
-               new java.util.StringTokenizer(new String(contents), " \t\n\r[]={,;");  //$NON-NLS-1$
-       String[] tokens = new String[st.countTokens()];
-       int i = 0;
-       while (st.hasMoreTokens()) {
-               tokens[i++] = st.nextToken();
-       }
-       final String prefix = FILEPREFIX;
-       i = 0;
-       buildFileFor(prefix + (++i) + ".rsc", "lhs", tokens, false); //$NON-NLS-2$ //$NON-NLS-1$
-       buildFileFor(prefix + (++i) + ".rsc", "check_table", tokens, true); //$NON-NLS-2$ //$NON-NLS-1$
-       buildFileFor(prefix + (++i) + ".rsc", "asb", tokens, false); //$NON-NLS-2$ //$NON-NLS-1$
-       buildFileFor(prefix + (++i) + ".rsc", "asr", tokens, false); //$NON-NLS-2$ //$NON-NLS-1$
-       buildFileFor(prefix + (++i) + ".rsc", "symbol_index", tokens, false); //$NON-NLS-2$ //$NON-NLS-1$
-       System.out.println(Util.bind("parser.moveFiles")); //$NON-NLS-1$
-}
-/*
- * Build initial recovery state.
- * Recovery state is inferred from the current state of the parser (reduced node stack).
- */
-public RecoveredElement buildInitialRecoveryState(){
-
-       /* initialize recovery by retrieving available reduced nodes 
-        * also rebuild bracket balance 
-        */
-       lastCheckPoint = 0;
-
-       RecoveredElement element = null;
-       if (referenceContext instanceof CompilationUnitDeclaration){
-               element = new RecoveredUnit(compilationUnit, 0, this);
-               
-               /* ignore current stack state, since restarting from the beginnning 
-                  since could not trust simple brace count */
-               if (true){ // experimenting restart recovery from scratch
-                       compilationUnit.currentPackage = null;
-                       compilationUnit.imports = null;
-                       compilationUnit.types = null;
-                       currentToken = 0;
-                       listLength = 0;
-                       return element;
-               }
-               if (compilationUnit.currentPackage != null){
-                       lastCheckPoint = compilationUnit.currentPackage.declarationSourceEnd+1;
-               }
-               if (compilationUnit.imports != null){
-                       lastCheckPoint = compilationUnit.imports[compilationUnit.imports.length -1].declarationSourceEnd+1;             
-               }
-       } else {
-               if (referenceContext instanceof AbstractMethodDeclaration){
-                       element = new RecoveredMethod((AbstractMethodDeclaration) referenceContext, null, 0, this);
-                       lastCheckPoint = ((AbstractMethodDeclaration) referenceContext).bodyStart;
-               } else {
-                       /* Initializer bodies are parsed in the context of the type declaration, we must thus search it inside */
-                       if (referenceContext instanceof TypeDeclaration){
-                               TypeDeclaration type = (TypeDeclaration) referenceContext;
-                               for (int i = 0; i < type.fields.length; i++){
-                                       FieldDeclaration field = type.fields[i];                                        
-                                       if (!field.isField()
-                                               && field.declarationSourceStart <= scanner.initialPosition
-                                               && scanner.initialPosition <= field.declarationSourceEnd
-                                               && scanner.eofPosition <= field.declarationSourceEnd+1){
-                                               element = new RecoveredInitializer((Initializer) field, null, 1, this);
-                                               lastCheckPoint = field.declarationSourceStart;                                  
-                                               break;
-                                       }
-                               }
-                       } 
-               }
-       }
-
-       if (element == null) return element;
-       
-       for(int i = 0; i <= astPtr; i++){
-               AstNode node = astStack[i];
-               if (node instanceof AbstractMethodDeclaration){
-                       AbstractMethodDeclaration method = (AbstractMethodDeclaration) node;
-                       if (method.declarationSourceEnd == 0){
-                               element = element.add(method, 0);
-                               lastCheckPoint = method.bodyStart;
-                       } else {
-                               element = element.add(method, 0);
-                               lastCheckPoint = method.declarationSourceEnd + 1;
-                       }
-                       continue;
-               }
-               if (node instanceof Initializer){
-                       Initializer initializer = (Initializer) node;
-                       if (initializer.declarationSourceEnd == 0){
-                               element = element.add(initializer, 1);
-                               lastCheckPoint = initializer.bodyStart;                         
-                       } else {
-                               element = element.add(initializer, 0);
-                               lastCheckPoint = initializer.declarationSourceEnd + 1;
-                       }
-                       continue;
-               }               
-               if (node instanceof FieldDeclaration){
-                       FieldDeclaration field = (FieldDeclaration) node;
-                       if (field.declarationSourceEnd == 0){
-                               element = element.add(field, 0);
-                               if (field.initialization == null){
-                                       lastCheckPoint = field.sourceEnd + 1;
-                               } else {
-                                       lastCheckPoint = field.initialization.sourceEnd + 1;
-                               }
-                       } else {
-                               element = element.add(field, 0);
-                               lastCheckPoint = field.declarationSourceEnd + 1;
-                       }
-                       continue;
-               }
-               if (node instanceof TypeDeclaration){
-                       TypeDeclaration type = (TypeDeclaration) node;
-                       if (type.declarationSourceEnd == 0){
-                               element = element.add(type, 0); 
-                               lastCheckPoint = type.bodyStart;
-                       } else {
-                               element = element.add(type, 0);                         
-                               lastCheckPoint = type.declarationSourceEnd + 1;
-                       }
-                       continue;
-               }
-               if (node instanceof ImportReference){
-                       ImportReference importRef = (ImportReference) node;
-                       element = element.add(importRef, 0);
-                       lastCheckPoint = importRef.declarationSourceEnd + 1;
-               }
-       }
-       return element;
-}
-protected static short check(int i) {
-       return check_table[i - (NUM_RULES + 1)];
-}
-/*
- * Reconsider the entire source looking for inconsistencies in {} () []
- */
-public boolean checkAndReportBracketAnomalies(ProblemReporter problemReporter) {
-
-       scanner.wasAcr = false;
-       boolean anomaliesDetected = false;      
-       try {
-               char[] source = scanner.source;
-               int[] leftCount = {0, 0, 0};
-               int[] rightCount = {0, 0, 0};
-               int[] depths = {0, 0, 0};
-               int[][] leftPositions = new int[][] {new int[10], new int[10], new int[10]};
-               int[][] leftDepths = new int[][] {new int[10], new int[10], new int[10]};
-               int[][] rightPositions = new int[][] {new int[10], new int[10], new int[10]};
-               int[][] rightDepths = new int[][] {new int[10], new int[10], new int[10]};
-               scanner.currentPosition = scanner.initialPosition; //starting point (first-zero-based char)
-               while (scanner.currentPosition < scanner.eofPosition) { //loop for jumping over comments
-                       try {
-                               // ---------Consume white space and handles startPosition---------
-                               boolean isWhiteSpace;
-                               do {
-                                       scanner.startPosition = scanner.currentPosition;
-                                       if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) {
-                                               isWhiteSpace = scanner.jumpOverUnicodeWhiteSpace();
-                                       } else {
-                                               if (scanner.recordLineSeparator && ((scanner.currentCharacter == '\r') || (scanner.currentCharacter == '\n'))) {
-                                                       if (scanner.lineEnds[scanner.linePtr] < scanner.startPosition) {
-                                                               // only record line positions we have not recorded yet
-                                                               scanner.pushLineSeparator();
-                                                       }
-                                               }
-                                               isWhiteSpace = Character.isWhitespace(scanner.currentCharacter);
-                                       }
-                               } while (isWhiteSpace && (scanner.currentPosition < scanner.eofPosition));
-
-                               // -------consume token until } is found---------
-
-                               switch (scanner.currentCharacter) {
-                                       case '{' :
-                                               {
-                                                       int index = leftCount[CurlyBracket] ++;
-                                                       if (index == leftPositions[CurlyBracket].length) {
-                                                               System.arraycopy(leftPositions[CurlyBracket], 0, (leftPositions[CurlyBracket] = new int[index * 2]), 0, index);
-                                                               System.arraycopy(leftDepths[CurlyBracket], 0, (leftDepths[CurlyBracket] = new int[index * 2]), 0, index);
-                                                       }
-                                                       leftPositions[CurlyBracket][index] = scanner.startPosition;
-                                                       leftDepths[CurlyBracket][index] = depths[CurlyBracket] ++;
-                                               }
-                                               break;
-                                       case '}' :
-                                               {
-                                                       int index = rightCount[CurlyBracket] ++;
-                                                       if (index == rightPositions[CurlyBracket].length) {
-                                                               System.arraycopy(rightPositions[CurlyBracket], 0, (rightPositions[CurlyBracket] = new int[index * 2]), 0, index);
-                                                               System.arraycopy(rightDepths[CurlyBracket], 0, (rightDepths[CurlyBracket] = new int[index * 2]), 0, index);
-                                                       }
-                                                       rightPositions[CurlyBracket][index] = scanner.startPosition;
-                                                       rightDepths[CurlyBracket][index] = --depths[CurlyBracket];
-                                               }
-                                               break;
-                                       case '(' :
-                                               {
-                                                       int index = leftCount[RoundBracket] ++;
-                                                       if (index == leftPositions[RoundBracket].length) {
-                                                               System.arraycopy(leftPositions[RoundBracket], 0, (leftPositions[RoundBracket] = new int[index * 2]), 0, index);
-                                                               System.arraycopy(leftDepths[RoundBracket], 0, (leftDepths[RoundBracket] = new int[index * 2]), 0, index);
-                                                       }
-                                                       leftPositions[RoundBracket][index] = scanner.startPosition;
-                                                       leftDepths[RoundBracket][index] = depths[RoundBracket] ++;
-                                               }
-                                               break;
-                                       case ')' :
-                                               {
-                                                       int index = rightCount[RoundBracket] ++;
-                                                       if (index == rightPositions[RoundBracket].length) {
-                                                               System.arraycopy(rightPositions[RoundBracket], 0, (rightPositions[RoundBracket] = new int[index * 2]), 0, index);
-                                                               System.arraycopy(rightDepths[RoundBracket], 0, (rightDepths[RoundBracket] = new int[index * 2]), 0, index);
-                                                       }
-                                                       rightPositions[RoundBracket][index] = scanner.startPosition;
-                                                       rightDepths[RoundBracket][index] = --depths[RoundBracket];
-                                               }
-                                               break;
-                                       case '[' :
-                                               {
-                                                       int index = leftCount[SquareBracket] ++;
-                                                       if (index == leftPositions[SquareBracket].length) {
-                                                               System.arraycopy(leftPositions[SquareBracket], 0, (leftPositions[SquareBracket] = new int[index * 2]), 0, index);
-                                                               System.arraycopy(leftDepths[SquareBracket], 0, (leftDepths[SquareBracket] = new int[index * 2]), 0, index);
-                                                       }
-                                                       leftPositions[SquareBracket][index] = scanner.startPosition;
-                                                       leftDepths[SquareBracket][index] = depths[SquareBracket] ++;
-                                               }
-                                               break;
-                                       case ']' :
-                                               {
-                                                       int index = rightCount[SquareBracket] ++;
-                                                       if (index == rightPositions[SquareBracket].length) {
-                                                               System.arraycopy(rightPositions[SquareBracket], 0, (rightPositions[SquareBracket] = new int[index * 2]), 0, index);
-                                                               System.arraycopy(rightDepths[SquareBracket], 0, (rightDepths[SquareBracket] = new int[index * 2]), 0, index);
-                                                       }
-                                                       rightPositions[SquareBracket][index] = scanner.startPosition;
-                                                       rightDepths[SquareBracket][index] = --depths[SquareBracket];
-                                               }
-                                               break;
-                                       case '\'' :
-                                               {
-                                                       if (scanner.getNextChar('\\')) {
-                                                               scanner.scanEscapeCharacter();
-                                                       } else { // consume next character
-                                                               scanner.unicodeAsBackSlash = false;
-                                                               if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) {
-                                                                       scanner.getNextUnicodeChar();
-                                                               } else {
-                                                                       if (scanner.withoutUnicodePtr != 0) {
-                                                                               scanner.withoutUnicodeBuffer[++scanner.withoutUnicodePtr] = scanner.currentCharacter;
-                                                                       }
-                                                               }
-                                                       }
-                                                       scanner.getNextChar('\'');
-                                                       break;
-                                               }
-                                       case '"' : // consume next character
-                                               scanner.unicodeAsBackSlash = false;
-                                               if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) {
-                                                       scanner.getNextUnicodeChar();
-                                               } else {
-                                                       if (scanner.withoutUnicodePtr != 0) {
-                                                               scanner.withoutUnicodeBuffer[++scanner.withoutUnicodePtr] = scanner.currentCharacter;
-                                                       }
-                                               }
-                                               while (scanner.currentCharacter != '"') {
-                                                       if (scanner.currentCharacter == '\r') {
-                                                               if (source[scanner.currentPosition] == '\n')
-                                                                       scanner.currentPosition++;
-                                                               break; // the string cannot go further that the line
-                                                       }
-                                                       if (scanner.currentCharacter == '\n') {
-                                                               break; // the string cannot go further that the line
-                                                       }
-                                                       if (scanner.currentCharacter == '\\') {
-                                                               scanner.scanEscapeCharacter();
-                                                       }
-                                                       // consume next character
-                                                       scanner.unicodeAsBackSlash = false;
-                                                       if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) {
-                                                               scanner.getNextUnicodeChar();
-                                                       } else {
-                                                               if (scanner.withoutUnicodePtr != 0) {
-                                                                       scanner.withoutUnicodeBuffer[++scanner.withoutUnicodePtr] = scanner.currentCharacter;
-                                                               }
-                                                       }
-                                               }
-                                               break;
-                                       case '/' :
-                                               {
-                                                       int test;
-                                                       if ((test = scanner.getNextChar('/', '*')) == 0) { //line comment 
-                                                               //get the next char 
-                                                               if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) {
-                                                                       //-------------unicode traitement ------------
-                                                                       int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
-                                                                       scanner.currentPosition++;
-                                                                       while (source[scanner.currentPosition] == 'u') {
-                                                                               scanner.currentPosition++;
-                                                                       }
-                                                                       if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c1 < 0 || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c2 < 0 || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c3 < 0 || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c4 < 0) { //error don't care of the value
-                                                                               scanner.currentCharacter = 'A';
-                                                                       } //something different from \n and \r
-                                                                       else {
-                                                                               scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
-                                                                       }
-                                                               }
-                                                               while (scanner.currentCharacter != '\r' && scanner.currentCharacter != '\n') {
-                                                                       //get the next char
-                                                                       scanner.startPosition = scanner.currentPosition;
-                                                                       if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) {
-                                                                               //-------------unicode traitement ------------
-                                                                               int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
-                                                                               scanner.currentPosition++;
-                                                                               while (source[scanner.currentPosition] == 'u') {
-                                                                                       scanner.currentPosition++;
-                                                                               }
-                                                                               if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c1 < 0 || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c2 < 0 || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c3 < 0 || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c4 < 0) { //error don't care of the value
-                                                                                       scanner.currentCharacter = 'A';
-                                                                               } //something different from \n and \r
-                                                                               else {
-                                                                                       scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
-                                                                               }
-                                                                       }
-                                                               }
-                                                               if (scanner.recordLineSeparator && ((scanner.currentCharacter == '\r') || (scanner.currentCharacter == '\n'))) {
-                                                                       if (scanner.lineEnds[scanner.linePtr] < scanner.startPosition) {
-                                                                               // only record line positions we have not recorded yet
-                                                                               scanner.pushLineSeparator();
-                                                                       }
-                                                               }
-                                                               break;
-                                                       }
-                                                       if (test > 0) { //traditional and annotation comment
-                                                               boolean star = false;
-                                                               // consume next character
-                                                               scanner.unicodeAsBackSlash = false;
-                                                               if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) {
-                                                                       scanner.getNextUnicodeChar();
-                                                               } else {
-                                                                       if (scanner.withoutUnicodePtr != 0) {
-                                                                               scanner.withoutUnicodeBuffer[++scanner.withoutUnicodePtr] = scanner.currentCharacter;
-                                                                       }
-                                                               }
-                                                               if (scanner.currentCharacter == '*') {
-                                                                       star = true;
-                                                               }
-                                                               //get the next char 
-                                                               if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) {
-                                                                       //-------------unicode traitement ------------
-                                                                       int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
-                                                                       scanner.currentPosition++;
-                                                                       while (source[scanner.currentPosition] == 'u') {
-                                                                               scanner.currentPosition++;
-                                                                       }
-                                                                       if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c1 < 0 || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c2 < 0 || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c3 < 0 || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c4 < 0) { //error don't care of the value
-                                                                               scanner.currentCharacter = 'A';
-                                                                       } //something different from * and /
-                                                                       else {
-                                                                               scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
-                                                                       }
-                                                               }
-                                                               //loop until end of comment */ 
-                                                               while ((scanner.currentCharacter != '/') || (!star)) {
-                                                                       star = scanner.currentCharacter == '*';
-                                                                       //get next char
-                                                                       if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) {
-                                                                               //-------------unicode traitement ------------
-                                                                               int c1 = 0, c2 = 0, c3 = 0, c4 = 0;
-                                                                               scanner.currentPosition++;
-                                                                               while (source[scanner.currentPosition] == 'u') {
-                                                                                       scanner.currentPosition++;
-                                                                               }
-                                                                               if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c1 < 0 || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c2 < 0 || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c3 < 0 || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c4 < 0) { //error don't care of the value
-                                                                                       scanner.currentCharacter = 'A';
-                                                                               } //something different from * and /
-                                                                               else {
-                                                                                       scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
-                                                                               }
-                                                                       }
-                                                               }
-                                                               break;
-                                                       }
-                                                       break;
-                                               }
-                                       default :
-                                               if (Character.isJavaIdentifierStart(scanner.currentCharacter)) {
-                                                       scanner.scanIdentifierOrKeyword();
-                                                       break;
-                                               }
-                                               if (Character.isDigit(scanner.currentCharacter)) {
-                                                       scanner.scanNumber(false);
-                                                       break;
-                                               }
-                               }
-                               //-----------------end switch while try--------------------
-                       } catch (IndexOutOfBoundsException e) {
-                                       break; // read until EOF
-                       } catch (InvalidInputException e) {
-                               return false; // no clue
-                       }
-               }
-               if (scanner.recordLineSeparator) {
-                       compilationUnit.compilationResult.lineSeparatorPositions = scanner.getLineEnds();
-               }
-
-               // check placement anomalies against other kinds of brackets
-               for (int kind = 0; kind < BracketKinds; kind++) {
-                       for (int leftIndex = leftCount[kind] - 1; leftIndex >= 0; leftIndex--) {
-                               int start = leftPositions[kind][leftIndex]; // deepest first
-                               // find matching closing bracket
-                               int depth = leftDepths[kind][leftIndex];
-                               int end = -1;
-                               for (int i = 0; i < rightCount[kind]; i++) {
-                                       int pos = rightPositions[kind][i];
-                                       // want matching bracket further in source with same depth
-                                       if ((pos > start) && (depth == rightDepths[kind][i])) {
-                                               end = pos;
-                                               break;
-                                       }
-                               }
-                               if (end < 0) { // did not find a good closing match
-                                       problemReporter.unmatchedBracket(start, referenceContext, compilationUnit.compilationResult);
-                                       return true;
-                               }
-                               // check if even number of opening/closing other brackets in between this pair of brackets
-                               int balance = 0;
-                               for (int otherKind = 0;(balance == 0) && (otherKind < BracketKinds); otherKind++) {
-                                       for (int i = 0; i < leftCount[otherKind]; i++) {
-                                               int pos = leftPositions[otherKind][i];
-                                               if ((pos > start) && (pos < end))
-                                                       balance++;
-                                       }
-                                       for (int i = 0; i < rightCount[otherKind]; i++) {
-                                               int pos = rightPositions[otherKind][i];
-                                               if ((pos > start) && (pos < end))
-                                                       balance--;
-                                       }
-                                       if (balance != 0) {
-                                               problemReporter.unmatchedBracket(start, referenceContext, compilationUnit.compilationResult); //bracket anomaly
-                                               return true;
-                                       }
-                               }
-                       }
-                       // too many opening brackets ?
-                       for (int i = rightCount[kind]; i < leftCount[kind]; i++) {
-                               anomaliesDetected = true;
-                               problemReporter.unmatchedBracket(leftPositions[kind][leftCount[kind] - i - 1], referenceContext, compilationUnit.compilationResult);
-                       }
-                       // too many closing brackets ?
-                       for (int i = leftCount[kind]; i < rightCount[kind]; i++) {
-                               anomaliesDetected = true;
-                               problemReporter.unmatchedBracket(rightPositions[kind][i], referenceContext, compilationUnit.compilationResult);
-                       }
-                       if (anomaliesDetected) return true;
-               }
-               
-               return anomaliesDetected;
-       } catch (ArrayStoreException e) { // jdk1.2.2 jit bug
-               return anomaliesDetected;
-       } catch (NullPointerException e) { // jdk1.2.2 jit bug
-               return anomaliesDetected;
-       }
-}
-public final void checkAndSetModifiers(int flag){
-       /*modify the current modifiers buffer.
-       When the startPosition of the modifiers is 0
-       it means that the modifier being parsed is the first
-       of a list of several modifiers. The startPosition
-       is zeroed when a copy of modifiers-buffer is push
-       onto the astStack. */
-
-       if ((modifiers & flag) != 0){ // duplicate modifier
-               modifiers |= AccAlternateModifierProblem;
-       }
-       modifiers |= flag;
-                       
-       if (modifiersSourceStart < 0) modifiersSourceStart = scanner.startPosition;
-}
-public void checkAnnotation() {
-
-       boolean deprecated = false;
-       boolean checkDeprecated = false;
-       int lastAnnotationIndex = -1;
-
-       //since jdk1.2 look only in the last java doc comment...
-       found : for (lastAnnotationIndex = scanner.commentPtr; lastAnnotationIndex >= 0; lastAnnotationIndex--){
-               //look for @deprecated into the first javadoc comment preceeding the declaration
-               int commentSourceStart = scanner.commentStarts[lastAnnotationIndex];
-               // javadoc only (non javadoc comment have negative end positions.)
-               if (modifiersSourceStart != -1 && modifiersSourceStart < commentSourceStart) {
-                       continue;
-               }
-               if (scanner.commentStops[lastAnnotationIndex] < 0) {
-                       break found;
-               }
-               checkDeprecated = true;
-               int commentSourceEnd = scanner.commentStops[lastAnnotationIndex] - 1; //stop is one over
-               char[] comment = scanner.source;
-
-               for (int i = commentSourceStart + 3; i < commentSourceEnd - 10; i++) {
-                       if ((comment[i] == '@') 
-                               && (comment[i + 1] == 'd')
-                               && (comment[i + 2] == 'e')
-                               && (comment[i + 3] == 'p')
-                               && (comment[i + 4] == 'r')
-                               && (comment[i + 5] == 'e')
-                               && (comment[i + 6] == 'c')
-                               && (comment[i + 7] == 'a')
-                               && (comment[i + 8] == 't')
-                               && (comment[i + 9] == 'e')
-                               && (comment[i + 10] == 'd')) {
-                               // ensure the tag is properly ended: either followed by a space, a tab, line end or asterisk.
-                               int nextPos = i+11;
-                               deprecated = (comment[nextPos] == ' ') || (comment[nextPos] == '\t') || (comment[nextPos] == '\n') || (comment[nextPos] == '\r') || (comment[nextPos] == '*');
-                               break found;
-                       }
-               }
-               break found;
-       }
-       if (deprecated) {
-               checkAndSetModifiers(AccDeprecated);
-       }
-       // modify the modifier source start to point at the first comment
-       if (lastAnnotationIndex >= 0 && checkDeprecated) {
-               modifiersSourceStart = scanner.commentStarts[lastAnnotationIndex]; 
-       }
-}
-protected void classInstanceCreation(boolean alwaysQualified) {
-       // ClassInstanceCreationExpression ::= 'new' ClassType '(' ArgumentListopt ')' ClassBodyopt
-
-       // ClassBodyopt produces a null item on the astStak if it produces NO class body
-       // An empty class body produces a 0 on the length stack.....
-
-       AllocationExpression alloc;
-       int length;
-       if (((length = astLengthStack[astLengthPtr--]) == 1)
-               && (astStack[astPtr] == null)) {
-               //NO ClassBody
-               astPtr--;
-               if (alwaysQualified) {
-                       alloc = new QualifiedAllocationExpression();
-               } else {
-                       alloc = new AllocationExpression();
-               }
-               alloc.sourceEnd = endPosition; //the position has been stored explicitly
-
-               if ((length = expressionLengthStack[expressionLengthPtr--]) != 0) {
-                       expressionPtr -= length;
-                       System.arraycopy(
-                               expressionStack, 
-                               expressionPtr + 1, 
-                               alloc.arguments = new Expression[length], 
-                               0, 
-                               length); 
-               }
-               alloc.type = getTypeReference(0);
-               //the default constructor with the correct number of argument
-               //will be created and added by the TC (see createsInternalConstructorWithBinding)
-               alloc.sourceStart = intStack[intPtr--];
-               pushOnExpressionStack(alloc);
-       } else {
-               dispatchDeclarationInto(length);
-               AnonymousLocalTypeDeclaration anonymousTypeDeclaration = (AnonymousLocalTypeDeclaration) astStack[astPtr];
-               anonymousTypeDeclaration.declarationSourceEnd = endStatementPosition;
-               anonymousTypeDeclaration.bodyEnd = endStatementPosition;
-               if (anonymousTypeDeclaration.allocation != null) {
-                       anonymousTypeDeclaration.allocation.sourceEnd = endStatementPosition;
-               }
-               astPtr--;
-               astLengthPtr--;
-               
-               // mark fields and initializer with local type mark if needed
-               markFieldsWithLocalType(anonymousTypeDeclaration);
-       }
-}
-protected final void concatExpressionLists() {
-       expressionLengthStack[--expressionLengthPtr]++;
-}
-private final void concatNodeLists() {
-       /*
-        * This is a case where you have two sublists into the astStack that you want
-        * to merge in one list. There is no action required on the astStack. The only
-        * thing you need to do is merge the two lengths specified on the astStackLength.
-        * The top two length are for example:
-        * ... p   n
-        * and you want to result in a list like:
-        * ... n+p 
-        * This means that the p could be equals to 0 in case there is no astNode pushed
-        * on the astStack.
-        * Look at the InterfaceMemberDeclarations for an example.
-        */
-
-       astLengthStack[astLengthPtr - 1] += astLengthStack[astLengthPtr--];
-}
-protected void consumeAllocationHeader() {
-       // ClassInstanceCreationExpression ::= 'new' ClassType '(' ArgumentListopt ')' ClassBodyopt
-
-       // ClassBodyopt produces a null item on the astStak if it produces NO class body
-       // An empty class body produces a 0 on the length stack.....
-
-       if (currentElement == null){
-               return; // should never occur, this consumeRule is only used in recovery mode
-       }
-       if (currentToken == TokenNameLBRACE){
-               // beginning of an anonymous type
-               AnonymousLocalTypeDeclaration anonymousType = new AnonymousLocalTypeDeclaration(this.compilationUnit.compilationResult);
-               anonymousType.sourceStart = intStack[intPtr--];
-               anonymousType.sourceEnd = rParenPos; // closing parenthesis
-               lastCheckPoint = anonymousType.bodyStart = scanner.currentPosition;
-               currentElement = currentElement.add(anonymousType, 0);
-               lastIgnoredToken = -1;
-               currentToken = 0; // opening brace already taken into account
-               return;
-       }
-       lastCheckPoint = scanner.startPosition; // force to restart at this exact position
-       restartRecovery = true; // request to restart from here on
-}
-protected void consumeArgumentList() {
-       // ArgumentList ::= ArgumentList ',' Expression
-       concatExpressionLists();
-}
-protected void consumeArrayAccess(boolean unspecifiedReference) {
-       // ArrayAccess ::= Name '[' Expression ']' ==> true
-       // ArrayAccess ::= PrimaryNoNewArray '[' Expression ']' ==> false
-
-
-       //optimize push/pop
-       Expression exp;
-       if (unspecifiedReference) {
-               exp = 
-                       expressionStack[expressionPtr] = 
-                               new ArrayReference(
-                                       getUnspecifiedReferenceOptimized(),
-                                       expressionStack[expressionPtr]);
-       } else {
-               expressionPtr--;
-               expressionLengthPtr--;
-               exp = 
-                       expressionStack[expressionPtr] = 
-                               new ArrayReference(
-                                       expressionStack[expressionPtr],
-                                       expressionStack[expressionPtr + 1]);
-       }
-       exp.sourceEnd = endPosition;
-}
-protected void consumeArrayCreationExpression() {
-       // ArrayCreationExpression ::= 'new' PrimitiveType DimWithOrWithOutExprs ArrayInitializeropt
-       // ArrayCreationExpression ::= 'new' ClassOrInterfaceType DimWithOrWithOutExprs ArrayInitializeropt
-
-       int length;
-       ArrayAllocationExpression aae = new ArrayAllocationExpression();
-       if (expressionLengthStack[expressionLengthPtr] != 0) {
-               expressionLengthPtr -- ;
-               aae.initializer = (ArrayInitializer) expressionStack[expressionPtr--];
-       } else {
-               expressionLengthPtr--;
-       }
-               
-       aae.type = getTypeReference(0);
-       length = (expressionLengthStack[expressionLengthPtr--]);
-       expressionPtr -= length ;
-       System.arraycopy(
-               expressionStack,
-               expressionPtr+1,
-               aae.dimensions = new Expression[length],
-               0,
-               length);
-       aae.sourceStart = intStack[intPtr--];
-       if (aae.initializer == null) {
-               aae.sourceEnd = endPosition;
-       } else {
-               aae.sourceEnd = aae.initializer.sourceEnd ;
-       }
-       pushOnExpressionStack(aae);
-}
-protected void consumeArrayInitializer() {
-       // ArrayInitializer ::= '{' VariableInitializers '}'
-       // ArrayInitializer ::= '{' VariableInitializers , '}'
+      case 118 : // System.out.println("ClassMemberDeclaration ::= SEMICOLON");
+        consumeEmptyClassMemberDeclaration();
+        break;
 
-       arrayInitializer(expressionLengthStack[expressionLengthPtr--]);
-}
+      case 119 : // System.out.println("FieldDeclaration ::= Modifiersopt Type VariableDeclarators SEMICOLON");
+        consumeFieldDeclaration();
+        break;
 
-protected void consumeAssertStatement() {
-       // AssertStatement ::= 'assert' Expression ':' Expression ';'
-       expressionLengthPtr-=2;
-       pushOnAstStack(new AssertStatement(expressionStack[expressionPtr--], expressionStack[expressionPtr--], intStack[intPtr--]));
-}
+      case 121 : // System.out.println("VariableDeclarators ::= VariableDeclarators COMMA VariableDeclarator");
+        consumeVariableDeclarators();
+        break;
 
-protected void consumeAssignment() {
-       // Assignment ::= LeftHandSide AssignmentOperator AssignmentExpression
-       //optimize the push/pop
-
-       int op = intStack[intPtr--] ; //<--the encoded operator
-       
-       expressionPtr -- ; expressionLengthPtr -- ;
-       expressionStack[expressionPtr] =
-               (op != EQUAL ) ?
-                       new CompoundAssignment(
-                               expressionStack[expressionPtr] ,
-                               expressionStack[expressionPtr+1], 
-                               op,
-                               scanner.startPosition - 1)      :
-                       new Assignment(
-                               expressionStack[expressionPtr] ,
-                               expressionStack[expressionPtr+1],
-                               scanner.startPosition - 1);
-}
-protected void consumeAssignmentOperator(int pos) {
-       // AssignmentOperator ::= '='
-       // AssignmentOperator ::= '*='
-       // AssignmentOperator ::= '/='
-       // AssignmentOperator ::= '%='
-       // AssignmentOperator ::= '+='
-       // AssignmentOperator ::= '-='
-       // AssignmentOperator ::= '<<='
-       // AssignmentOperator ::= '>>='
-       // AssignmentOperator ::= '>>>='
-       // AssignmentOperator ::= '&='
-       // AssignmentOperator ::= '^='
-       // AssignmentOperator ::= '|='
-
-       try {
-               intStack[++intPtr] = pos;
-       } catch (IndexOutOfBoundsException e) {
-               //intPtr is correct 
-               int oldStackLength = intStack.length;
-               int oldStack[] = intStack;
-               intStack = new int[oldStackLength + StackIncrement];
-               System.arraycopy(oldStack, 0, intStack, 0, oldStackLength);
-               intStack[intPtr] = pos;
-       }
-}
-protected void consumeBinaryExpression(int op) {
-       // MultiplicativeExpression ::= MultiplicativeExpression '*' UnaryExpression
-       // MultiplicativeExpression ::= MultiplicativeExpression '/' UnaryExpression
-       // MultiplicativeExpression ::= MultiplicativeExpression '%' UnaryExpression
-       // AdditiveExpression ::= AdditiveExpression '+' MultiplicativeExpression
-       // AdditiveExpression ::= AdditiveExpression '-' MultiplicativeExpression
-       // ShiftExpression ::= ShiftExpression '<<'  AdditiveExpression
-       // ShiftExpression ::= ShiftExpression '>>'  AdditiveExpression
-       // ShiftExpression ::= ShiftExpression '>>>' AdditiveExpression
-       // RelationalExpression ::= RelationalExpression '<'  ShiftExpression
-       // RelationalExpression ::= RelationalExpression '>'  ShiftExpression
-       // RelationalExpression ::= RelationalExpression '<=' ShiftExpression
-       // RelationalExpression ::= RelationalExpression '>=' ShiftExpression
-       // AndExpression ::= AndExpression '&' EqualityExpression
-       // ExclusiveOrExpression ::= ExclusiveOrExpression '^' AndExpression
-       // InclusiveOrExpression ::= InclusiveOrExpression '|' ExclusiveOrExpression
-       // ConditionalAndExpression ::= ConditionalAndExpression '&&' InclusiveOrExpression
-       // ConditionalOrExpression ::= ConditionalOrExpression '||' ConditionalAndExpression
-
-       //optimize the push/pop
-
-       expressionPtr--;
-       expressionLengthPtr--;
-       if (op == OR_OR) {
-               expressionStack[expressionPtr] = 
-                       new OR_OR_Expression(
-                               expressionStack[expressionPtr], 
-                               expressionStack[expressionPtr + 1], 
-                               op); 
-       } else {
-               if (op == AND_AND) {
-                       expressionStack[expressionPtr] = 
-                               new AND_AND_Expression(
-                                       expressionStack[expressionPtr], 
-                                       expressionStack[expressionPtr + 1], 
-                                       op);
-               } else {
-                       // look for "string1" + "string2"
-                       if ((op == PLUS) && optimizeStringLiterals) {
-                               Expression expr1, expr2;
-                               expr1 = expressionStack[expressionPtr];
-                               expr2 = expressionStack[expressionPtr + 1];
-                               if (expr1 instanceof StringLiteral) {
-                                       if (expr2 instanceof CharLiteral) { // string+char
-                                               expressionStack[expressionPtr] = 
-                                                       ((StringLiteral) expr1).extendWith((CharLiteral) expr2); 
-                                       } else if (expr2 instanceof StringLiteral) { //string+string
-                                               expressionStack[expressionPtr] = 
-                                                       ((StringLiteral) expr1).extendWith((StringLiteral) expr2); 
-                                       } else {
-                                               expressionStack[expressionPtr] = new BinaryExpression(expr1, expr2, PLUS);
-                                       }
-                               } else {
-                                       expressionStack[expressionPtr] = new BinaryExpression(expr1, expr2, PLUS);
-                               }
-                       } else {
-                               expressionStack[expressionPtr] = 
-                                       new BinaryExpression(
-                                               expressionStack[expressionPtr], 
-                                               expressionStack[expressionPtr + 1], 
-                                               op);
-                       }
-               }
-       }
-}
-protected void consumeBlock() {
-       // Block ::= OpenBlock '{' BlockStatementsopt '}'
-       // simpler action for empty blocks
-
-       int length;
-       if ((length = astLengthStack[astLengthPtr--]) == 0) { // empty block 
-               pushOnAstStack(Block.EmptyWith(intStack[intPtr--], endStatementPosition));
-               realBlockPtr--; // still need to pop the block variable counter
-       } else {
-               Block bk = new Block(realBlockStack[realBlockPtr--]);
-               astPtr -= length;
-               System.arraycopy(
-                       astStack, 
-                       astPtr + 1, 
-                       bk.statements = new Statement[length], 
-                       0, 
-                       length); 
-               pushOnAstStack(bk);
-               bk.sourceStart = intStack[intPtr--];
-               bk.sourceEnd = endStatementPosition;
-       }
-}
-protected void consumeBlockStatements() {
-       // BlockStatements ::= BlockStatements BlockStatement
-       concatNodeLists();
-}
-protected void consumeCaseLabel() {
-       // SwitchLabel ::= 'case' ConstantExpression ':'
-       expressionLengthPtr--;
-       pushOnAstStack(new Case(intStack[intPtr--], expressionStack[expressionPtr--]));
-}
-protected void consumeCastExpression() {
-       // CastExpression ::= PushLPAREN PrimitiveType Dimsopt PushRPAREN UnaryExpression
-       // CastExpression ::= PushLPAREN Name Dims PushRPAREN UnaryExpressionNotPlusMinus
+      case 124 : // System.out.println("EnterVariable ::=");
+        consumeEnterVariable();
+        break;
 
-       //intStack : posOfLeftParen dim posOfRightParen
+      case 125 : // System.out.println("ExitVariableWithInitialization ::=");
+        consumeExitVariableWithInitialization();
+        break;
 
-       //optimize the push/pop
+      case 126 : // System.out.println("ExitVariableWithoutInitialization ::=");
+        consumeExitVariableWithoutInitialization();
+        break;
 
-       Expression exp, cast, castType;
-       int end = intStack[intPtr--];
-       expressionStack[expressionPtr] = cast = new CastExpression(exp = expressionStack[expressionPtr], castType = getTypeReference(intStack[intPtr--]));
-       castType.sourceEnd = end - 1;
-       castType.sourceStart = (cast.sourceStart = intStack[intPtr--]) + 1;
-       cast.sourceEnd = exp.sourceEnd;
-}
-protected void consumeCastExpressionLL1() {
-       //CastExpression ::= '(' Expression ')' UnaryExpressionNotPlusMinus
-       // Expression is used in order to make the grammar LL1
-
-       //optimize push/pop
-
-       Expression castType,cast,exp;
-       expressionPtr--;
-       expressionStack[expressionPtr] = 
-                       cast = new CastExpression(      exp=expressionStack[expressionPtr+1] ,
-                                                               castType = getTypeReference(expressionStack[expressionPtr]));
-       expressionLengthPtr -- ;
-       updateSourcePosition(castType);
-       cast.sourceStart=castType.sourceStart;
-       cast.sourceEnd=exp.sourceEnd;
-       castType.sourceStart++;
-       castType.sourceEnd--;
-       }
-protected void consumeCatches() {
-       // Catches ::= Catches CatchClause
-       optimizedConcatNodeLists();
-}
-protected void consumeCatchHeader() {
-       // CatchDeclaration ::= 'catch' '(' FormalParameter ')' '{'
-
-       if (currentElement == null){
-               return; // should never occur, this consumeRule is only used in recovery mode
-       }
-       // current element should be a block due to the presence of the opening brace
-       if (!(currentElement instanceof RecoveredBlock)){
-               return;
-       }
-       // exception argument is already on astStack
-       ((RecoveredBlock)currentElement).attach(
-               new RecoveredLocalVariable((Argument)astStack[astPtr--], currentElement, 0)); // insert catch variable in catch block
-       lastCheckPoint = scanner.startPosition; // force to restart at this exact position
-       restartRecovery = true; // request to restart from here on
-       lastIgnoredToken = -1;
-}
-protected void consumeClassBodyDeclaration() {
-       // ClassBodyDeclaration ::= Diet Block
-       //push an Initializer
-       //optimize the push/pop
-       nestedMethod[nestedType]--;
-       Initializer initializer = new Initializer((Block) astStack[astPtr], 0);
-       intPtr--; // pop sourcestart left on the stack by consumeNestedMethod.
-       realBlockPtr--; // pop the block variable counter left on the stack by consumeNestedMethod
-       int javadocCommentStart = intStack[intPtr--];
-       if (javadocCommentStart != -1) {
-               initializer.declarationSourceStart = javadocCommentStart;
-       }
-       astStack[astPtr] = initializer;
-       initializer.sourceEnd = endStatementPosition;
-       initializer.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition);
-}
-protected void consumeClassBodyDeclarations() {
-       // ClassBodyDeclarations ::= ClassBodyDeclarations ClassBodyDeclaration
-       concatNodeLists();
-}
-protected void consumeClassBodyDeclarationsopt() {
-       // ClassBodyDeclarationsopt ::= NestedType ClassBodyDeclarations
-       nestedType-- ;
-}
-protected void consumeClassBodyopt() {
-       // ClassBodyopt ::= $empty
-       pushOnAstStack(null);
-       endPosition = scanner.startPosition - 1;
-}
-protected void consumeClassDeclaration() {
-       // ClassDeclaration ::= ClassHeader ClassBody
-
-       int length;
-       if ((length = astLengthStack[astLengthPtr--]) != 0) {
-               //there are length declarations
-               //dispatch according to the type of the declarations
-               dispatchDeclarationInto(length);
-       }
-
-       TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
-
-       // mark fields and initializer with local type mark if needed
-       markFieldsWithLocalType(typeDecl);
-
-       //convert constructor that do not have the type's name into methods
-       boolean hasConstructor = typeDecl.checkConstructors(this);
-       
-       //add the default constructor when needed (interface don't have it)
-       if (!hasConstructor) {
-               boolean insideFieldInitializer = false;
-               if (diet) {
-                       for (int i = nestedType; i > 0; i--){
-                               if (variablesCounter[i] > 0) {
-                                       insideFieldInitializer = true;
-                                       break;
-                               }
-                       }
-               }
-               typeDecl.createsInternalConstructor(!diet || insideFieldInitializer, true);
-       }
-
-       //always add <clinit> (will be remove at code gen time if empty)
-       if (this.scanner.containsAssertKeyword) {
-               typeDecl.bits |= AstNode.AddAssertionMASK;
-       }
-       typeDecl.addClinit();
-       typeDecl.bodyEnd = endStatementPosition;
-       typeDecl.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition); 
-}
-protected void consumeClassHeader() {
-       // ClassHeader ::= ClassHeaderName ClassHeaderExtendsopt ClassHeaderImplementsopt
-
-       TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];  
-       if (currentToken == TokenNameLBRACE) { 
-               typeDecl.bodyStart = scanner.currentPosition;
-       }
-       if (currentElement != null) {
-               restartRecovery = true; // used to avoid branching back into the regular automaton              
-       }
-       // flush the comments related to the class header
-       scanner.commentPtr = -1;
-}
-protected void consumeClassHeaderExtends() {
-       // ClassHeaderExtends ::= 'extends' ClassType
-       // There is a class declaration on the top of stack
-       TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
-       //superclass
-       typeDecl.superclass = getTypeReference(0);
-       typeDecl.bodyStart = typeDecl.superclass.sourceEnd + 1;
-       // recovery
-       if (currentElement != null){
-               lastCheckPoint = typeDecl.bodyStart;
-       }
-}
-protected void consumeClassHeaderImplements() {
-       // ClassHeaderImplements ::= 'implements' InterfaceTypeList
-       int length = astLengthStack[astLengthPtr--];
-       //super interfaces
-       astPtr -= length;
-       // There is a class declaration on the top of stack
-       TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
-       System.arraycopy(
-               astStack, 
-               astPtr + 1, 
-               typeDecl.superInterfaces = new TypeReference[length], 
-               0, 
-               length); 
-       typeDecl.bodyStart = typeDecl.superInterfaces[length-1].sourceEnd + 1;
-       listLength = 0; // reset after having read super-interfaces
-       // recovery
-       if (currentElement != null) { // is recovering
-               lastCheckPoint = typeDecl.bodyStart;
-       }
-}
-protected void consumeClassHeaderName() {
-       // ClassHeaderName ::= Modifiersopt 'class' 'Identifier'
-       TypeDeclaration typeDecl;
-       if (nestedMethod[nestedType] == 0) {
-               if (nestedType != 0) {
-                       typeDecl = new MemberTypeDeclaration(this.compilationUnit.compilationResult);
-               } else {
-                       typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult);
-               }
-       } else {
-               // Record that the block has a declaration for local types
-               typeDecl = new LocalTypeDeclaration(this.compilationUnit.compilationResult);
-               markCurrentMethodWithLocalType();
-               blockReal();
-       }
-
-       //highlight the name of the type
-       long pos = identifierPositionStack[identifierPtr];
-       typeDecl.sourceEnd = (int) pos;
-       typeDecl.sourceStart = (int) (pos >>> 32);
-       typeDecl.name = identifierStack[identifierPtr--];
-       identifierLengthPtr--;
-
-       //compute the declaration source too
-       // 'class' and 'interface' push two int positions: the beginning of the class token and its end.
-       // we want to keep the beginning position but get rid of the end position
-       // it is only used for the ClassLiteralAccess positions.
-       typeDecl.declarationSourceStart = intStack[intPtr--]; 
-       intPtr--; // remove the end position of the class token
-
-       typeDecl.modifiersSourceStart = intStack[intPtr--];
-       typeDecl.modifiers = intStack[intPtr--];
-       if (typeDecl.modifiersSourceStart >= 0) {
-               typeDecl.declarationSourceStart = typeDecl.modifiersSourceStart;
-       }
-       typeDecl.bodyStart = typeDecl.sourceEnd + 1;
-       pushOnAstStack(typeDecl);
-
-       listLength = 0; // will be updated when reading super-interfaces
-       // recovery
-       if (currentElement != null){ 
-               lastCheckPoint = typeDecl.bodyStart;
-               currentElement = currentElement.add(typeDecl, 0);
-               lastIgnoredToken = -1;
-       }
-}
-protected void consumeClassInstanceCreationExpression() {
-       // ClassInstanceCreationExpression ::= 'new' ClassType '(' ArgumentListopt ')' ClassBodyopt
-       classInstanceCreation(false);
-}
-protected void consumeClassInstanceCreationExpressionName() {
-       // ClassInstanceCreationExpressionName ::= Name '.'
-       pushOnExpressionStack(getUnspecifiedReferenceOptimized());
-}
-protected void consumeClassInstanceCreationExpressionQualified() {
-       // ClassInstanceCreationExpression ::= Primary '.' 'new' SimpleName '(' ArgumentListopt ')' ClassBodyopt
-       // ClassInstanceCreationExpression ::= ClassInstanceCreationExpressionName 'new' SimpleName '(' ArgumentListopt ')' ClassBodyopt
-
-       classInstanceCreation(true); //  <-- push the Qualifed....
-
-       expressionLengthPtr--;
-       QualifiedAllocationExpression qae = 
-               (QualifiedAllocationExpression) expressionStack[expressionPtr--]; 
-       qae.enclosingInstance = expressionStack[expressionPtr];
-       expressionStack[expressionPtr] = qae;
-       qae.sourceStart = qae.enclosingInstance.sourceStart;
-}
-protected void consumeClassTypeElt() {
-       // ClassTypeElt ::= ClassType
-       pushOnAstStack(getTypeReference(0));
-       /* if incomplete thrown exception list, listLength counter will not have been reset,
-               indicating that some items are available on the stack */
-       listLength++;   
-}
-protected void consumeClassTypeList() {
-       // ClassTypeList ::= ClassTypeList ',' ClassTypeElt
-       optimizedConcatNodeLists();
-}
-protected void consumeCompilationUnit() {
-       // CompilationUnit ::= EnterCompilationUnit PackageDeclarationopt ImportDeclarationsopt
-       // do nothing by default
-}
-protected void consumeConditionalExpression(int op) {
-       // ConditionalExpression ::= ConditionalOrExpression '?' Expression ':' ConditionalExpression
-       //optimize the push/pop
-
-       expressionPtr -= 2;
-       expressionLengthPtr -= 2;
-       expressionStack[expressionPtr] =
-               new ConditionalExpression(
-                       expressionStack[expressionPtr],
-                       expressionStack[expressionPtr + 1],
-                       expressionStack[expressionPtr + 2]);
-}
-protected void consumeConstructorBlockStatements() {
-       // ConstructorBody ::= NestedMethod '{' ExplicitConstructorInvocation BlockStatements '}'
-       concatNodeLists(); // explictly add the first statement into the list of statements 
-}
-protected void consumeConstructorBody() {
-       // ConstructorBody ::= NestedMethod  '{' BlockStatementsopt '}'
-       // ConstructorBody ::= NestedMethod  '{' ExplicitConstructorInvocation '}'
-       nestedMethod[nestedType] --;
-}
-protected void consumeConstructorDeclaration() {
-       // ConstructorDeclaration ::= ConstructorHeader ConstructorBody
-
-       /*
-       astStack : MethodDeclaration statements
-       identifierStack : name
-        ==>
-       astStack : MethodDeclaration
-       identifierStack :
-       */
-
-       //must provide a default constructor call when needed
-
-       int length;
-
-       // pop the position of the {  (body of the method) pushed in block decl
-       intPtr--;
-
-       //statements
-       realBlockPtr--;
-       ExplicitConstructorCall constructorCall = null;
-       Statement[] statements = null;
-       if ((length = astLengthStack[astLengthPtr--]) != 0) {
-               astPtr -= length;
-               if (astStack[astPtr + 1] instanceof ExplicitConstructorCall) {
-                       //avoid a isSomeThing that would only be used here BUT what is faster between two alternatives ?
-                       System.arraycopy(
-                               astStack, 
-                               astPtr + 2, 
-                               statements = new Statement[length - 1], 
-                               0, 
-                               length - 1); 
-                       constructorCall = (ExplicitConstructorCall) astStack[astPtr + 1];
-               } else { //need to add explicitly the super();
-                       System.arraycopy(
-                               astStack, 
-                               astPtr + 1, 
-                               statements = new Statement[length], 
-                               0, 
-                               length); 
-                       constructorCall = SuperReference.implicitSuperConstructorCall();
-               }
-       } else {
-               if (!diet){
-                       // add it only in non-diet mode, if diet_bodies, then constructor call will be added elsewhere.
-                       constructorCall = SuperReference.implicitSuperConstructorCall();
-               }
-       }
-
-       // now we know that the top of stack is a constructorDeclaration
-       ConstructorDeclaration cd = (ConstructorDeclaration) astStack[astPtr];
-       cd.constructorCall = constructorCall;
-       cd.statements = statements;
-
-       //highlight of the implicit call on the method name
-       if (constructorCall != null && cd.constructorCall.sourceEnd == 0) {
-               cd.constructorCall.sourceEnd = cd.sourceEnd;
-               cd.constructorCall.sourceStart = cd.sourceStart;
-       }
-
-       //watch for } that could be given as a unicode ! ( u007D is '}' )
-       // store the endPosition (position just before the '}') in case there is
-       // a trailing comment behind the end of the method
-       cd.bodyEnd = endPosition;
-       cd.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition); 
-}
+      case 127 : // System.out.println("ForceNoDiet ::=");
+        consumeForceNoDiet();
+        break;
 
-protected void consumeInvalidConstructorDeclaration() {
-       // ConstructorDeclaration ::= ConstructorHeader ';'
-       // now we know that the top of stack is a constructorDeclaration
-       ConstructorDeclaration cd = (ConstructorDeclaration) astStack[astPtr];
+      case 128 : // System.out.println("RestoreDiet ::=");
+        consumeRestoreDiet();
+        break;
 
-       cd.bodyEnd = endPosition; // position just before the trailing semi-colon
-       cd.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition); 
-       // report the problem and continue the parsing - narrowing the problem onto the method
-}
-protected void consumeConstructorHeader() {
-       // ConstructorHeader ::= ConstructorHeaderName MethodHeaderParameters MethodHeaderThrowsClauseopt
-
-       AbstractMethodDeclaration method = (AbstractMethodDeclaration)astStack[astPtr];
-
-       if (currentToken == TokenNameLBRACE){ 
-               method.bodyStart = scanner.currentPosition;
-       }
-       // recovery
-       if (currentElement != null){
-               restartRecovery = true; // used to avoid branching back into the regular automaton
-       }               
-}
-protected void consumeConstructorHeaderName() {
-
-       /* recovering - might be an empty message send */
-       if (currentElement != null){
-               if (lastIgnoredToken == TokenNamenew){ // was an allocation expression
-                       lastCheckPoint = scanner.startPosition; // force to restart at this exact position                              
-                       restartRecovery = true;
-                       return;
-               }
-       }
-       
-       // ConstructorHeaderName ::=  Modifiersopt 'Identifier' '('
-       ConstructorDeclaration cd = new ConstructorDeclaration(this.compilationUnit.compilationResult);
-
-       //name -- this is not really revelant but we do .....
-       cd.selector = identifierStack[identifierPtr];
-       long selectorSource = identifierPositionStack[identifierPtr--];
-       identifierLengthPtr--;
-
-       //modifiers
-       cd.declarationSourceStart = intStack[intPtr--];
-       cd.modifiers = intStack[intPtr--];
-
-       //highlight starts at the selector starts
-       cd.sourceStart = (int) (selectorSource >>> 32);
-       pushOnAstStack(cd);
-       cd.sourceEnd = lParenPos;
-       cd.bodyStart = lParenPos+1;
-       listLength = 0; // initialize listLength before reading parameters/throws
-
-       // recovery
-       if (currentElement != null){
-               lastCheckPoint = cd.bodyStart;
-               if ((currentElement instanceof RecoveredType && lastIgnoredToken != TokenNameDOT)
-                       || cd.modifiers != 0){
-                       currentElement = currentElement.add(cd, 0);
-                       lastIgnoredToken = -1;
-               }
-       }       
-}
-protected void consumeDefaultLabel() {
-       // SwitchLabel ::= 'default' ':'
-       pushOnAstStack(new DefaultCase(intStack[intPtr--], intStack[intPtr--]));
-}
-protected void consumeDefaultModifiers() {
-       checkAnnotation(); // might update modifiers with AccDeprecated
-       pushOnIntStack(modifiers); // modifiers
-       pushOnIntStack(
-               modifiersSourceStart >= 0 ? modifiersSourceStart : scanner.startPosition); 
-       resetModifiers();
-}
-protected void consumeDiet() {
-       // Diet ::= $empty
-       checkAnnotation();
-       pushOnIntStack(modifiersSourceStart); // push the start position of a javadoc comment if there is one
-       jumpOverMethodBody();
-}
-protected void consumeDims() {
-       // Dims ::= DimsLoop
-       pushOnIntStack(dimensions);
-       dimensions = 0;
-}
-protected void consumeDimWithOrWithOutExpr() {
-       // DimWithOrWithOutExpr ::= '[' ']'
-       pushOnExpressionStack(null);
-}
-protected void consumeDimWithOrWithOutExprs() {
-       // DimWithOrWithOutExprs ::= DimWithOrWithOutExprs DimWithOrWithOutExpr
-       concatExpressionLists();
-}
-protected void consumeEmptyArgumentListopt() {
-       // ArgumentListopt ::= $empty
-       pushOnExpressionStackLengthStack(0);
-}
-protected void consumeEmptyArrayInitializer() {
-       // ArrayInitializer ::= '{' ,opt '}'
-       arrayInitializer(0);
-}
-protected void consumeEmptyArrayInitializeropt() {
-       // ArrayInitializeropt ::= $empty
-       pushOnExpressionStackLengthStack(0);
-}
-protected void consumeEmptyBlockStatementsopt() {
-       // BlockStatementsopt ::= $empty
-       pushOnAstLengthStack(0);
-}
-protected void consumeEmptyCatchesopt() {
-       // Catchesopt ::= $empty
-       pushOnAstLengthStack(0);
-}
-protected void consumeEmptyClassBodyDeclarationsopt() {
-       // ClassBodyDeclarationsopt ::= $empty
-       pushOnAstLengthStack(0);
-}
-protected void consumeEmptyClassMemberDeclaration() {
-       // ClassMemberDeclaration ::= ';'
-       pushOnAstLengthStack(0);
-}
-protected void consumeEmptyDimsopt() {
-       // Dimsopt ::= $empty
-       pushOnIntStack(0);
-}
-protected void consumeEmptyExpression() {
-       // Expressionopt ::= $empty
-       pushOnExpressionStackLengthStack(0);
-}
-protected void consumeEmptyForInitopt() {
-       // ForInitopt ::= $empty
-       pushOnAstLengthStack(0);
-}
-protected void consumeEmptyForUpdateopt() {
-       // ForUpdateopt ::= $empty
-       pushOnExpressionStackLengthStack(0);
-}
-protected void consumeEmptyImportDeclarationsopt() {
-       // ImportDeclarationsopt ::= $empty
-       pushOnAstLengthStack(0);
-}
-protected void consumeEmptyInterfaceMemberDeclaration() {
-       // InterfaceMemberDeclaration ::= ';'
-       pushOnAstLengthStack(0);
-}
-protected void consumeEmptyInterfaceMemberDeclarationsopt() {
-       // InterfaceMemberDeclarationsopt ::= $empty
-       pushOnAstLengthStack(0);
-}
-protected void consumeEmptyStatement() {
-       // EmptyStatement ::= ';'
-       if (this.scanner.source[endStatementPosition] == ';') {
-               pushOnAstStack(new EmptyStatement(endStatementPosition, endStatementPosition));
-       } else {
-               // we have a Unicode for the ';' (/u003B)
-               pushOnAstStack(new EmptyStatement(endStatementPosition - 5, endStatementPosition));
-       }
-}
-protected void consumeEmptySwitchBlock() {
-       // SwitchBlock ::= '{' '}'
-       pushOnAstLengthStack(0);
-}
-protected void consumeEmptyTypeDeclaration() {
-       // TypeDeclaration ::= ';' 
-       pushOnAstLengthStack(0);
-}
-protected void consumeEmptyTypeDeclarationsopt() {
-       // TypeDeclarationsopt ::= $empty
-       pushOnAstLengthStack(0); 
-}
-protected void consumeEnterAnonymousClassBody() {
-       // EnterAnonymousClassBody ::= $empty
-       QualifiedAllocationExpression alloc;
-       AnonymousLocalTypeDeclaration anonymousType = 
-               new AnonymousLocalTypeDeclaration(this.compilationUnit.compilationResult); 
-       alloc = 
-               anonymousType.allocation = new QualifiedAllocationExpression(anonymousType); 
-       markCurrentMethodWithLocalType();
-       pushOnAstStack(anonymousType);
-
-       alloc.sourceEnd = rParenPos; //the position has been stored explicitly
-       int argumentLength;
-       if ((argumentLength = expressionLengthStack[expressionLengthPtr--]) != 0) {
-               expressionPtr -= argumentLength;
-               System.arraycopy(
-                       expressionStack, 
-                       expressionPtr + 1, 
-                       alloc.arguments = new Expression[argumentLength], 
-                       0, 
-                       argumentLength); 
-       }
-       alloc.type = getTypeReference(0);
-
-       anonymousType.sourceEnd = alloc.sourceEnd;
-       //position at the type while it impacts the anonymous declaration
-       anonymousType.sourceStart = anonymousType.declarationSourceStart = alloc.type.sourceStart;
-       alloc.sourceStart = intStack[intPtr--];
-       pushOnExpressionStack(alloc);
-
-       anonymousType.bodyStart = scanner.currentPosition;      
-       listLength = 0; // will be updated when reading super-interfaces
-       // recovery
-       if (currentElement != null){ 
-               lastCheckPoint = anonymousType.bodyStart;
-               // the recoveryTokenCheck will deal with the open brace         
-               currentElement = currentElement.add(anonymousType, 0);
-               currentToken = 0; // opening brace already taken into account
-               lastIgnoredToken = -1;
-       }       
-}
-protected void consumeEnterCompilationUnit() {
-       // EnterCompilationUnit ::= $empty
-       // do nothing by default
-}
-protected void consumeEnterVariable() {
-       // EnterVariable ::= $empty
-       // do nothing by default
-
-       char[] name = identifierStack[identifierPtr];
-       long namePosition = identifierPositionStack[identifierPtr];
-       int extendedDimension = intStack[intPtr--];
-       AbstractVariableDeclaration declaration;
-       // create the ast node
-       boolean isLocalDeclaration = nestedMethod[nestedType] != 0; 
-       if (isLocalDeclaration) {
-               // create the local variable declarations
-               declaration = 
-                       this.createLocalDeclaration(null, name, (int) (namePosition >>> 32), (int) namePosition);
-       } else {
-               // create the field declaration
-               declaration = 
-                       this.createFieldDeclaration(null, name, (int) (namePosition >>> 32), (int) namePosition); 
-       }
-       
-       identifierPtr--;
-       identifierLengthPtr--;
-       TypeReference type;
-       int variableIndex = variablesCounter[nestedType];
-       int typeDim = 0;
-       if (variableIndex == 0) {
-               // first variable of the declaration (FieldDeclaration or LocalDeclaration)
-               if (isLocalDeclaration) {
-                       declaration.declarationSourceStart = intStack[intPtr--];
-                       declaration.modifiers = intStack[intPtr--];
-                       type = getTypeReference(typeDim = intStack[intPtr--]); // type dimension
-                       if (declaration.declarationSourceStart == -1) {
-                               // this is true if there is no modifiers for the local variable declaration
-                               declaration.declarationSourceStart = type.sourceStart;
-                       }
-                       pushOnAstStack(type);
-               } else {
-                       type = getTypeReference(typeDim = intStack[intPtr--]); // type dimension
-                       pushOnAstStack(type);
-                       declaration.declarationSourceStart = intStack[intPtr--];
-                       declaration.modifiers = intStack[intPtr--];
-               }
-       } else {
-               type = (TypeReference) astStack[astPtr - variableIndex];
-               typeDim = type.dimensions();
-               AbstractVariableDeclaration previousVariable = 
-                       (AbstractVariableDeclaration) astStack[astPtr]; 
-               declaration.declarationSourceStart = previousVariable.declarationSourceStart;
-               declaration.modifiers = previousVariable.modifiers;
-       }
-
-       if (extendedDimension == 0) {
-               declaration.type = type;
-       } else {
-               int dimension = typeDim + extendedDimension;
-               //on the identifierLengthStack there is the information about the type....
-               int baseType;
-               if ((baseType = identifierLengthStack[identifierLengthPtr + 1]) < 0) {
-                       //it was a baseType
-                       int typeSourceStart = type.sourceStart;
-                       int typeSourceEnd = type.sourceEnd;
-                       type = TypeReference.baseTypeReference(-baseType, dimension);
-                       type.sourceStart = typeSourceStart;
-                       type.sourceEnd = typeSourceEnd;
-                       declaration.type = type;
-               } else {
-                       declaration.type = this.copyDims(type, dimension);
-               }
-       }
-       variablesCounter[nestedType]++;
-       pushOnAstStack(declaration);
-       // recovery
-       if (currentElement != null) {
-               if (!(currentElement instanceof RecoveredType)
-                       && (currentToken == TokenNameDOT
-                               //|| declaration.modifiers != 0
-                               || (scanner.getLineNumber(declaration.type.sourceStart)
-                                               != scanner.getLineNumber((int) (namePosition >>> 32))))){
-                       lastCheckPoint = (int) (namePosition >>> 32);
-                       restartRecovery = true;
-                       return;
-               }
-               if (isLocalDeclaration){
-                       LocalDeclaration localDecl = (LocalDeclaration) astStack[astPtr];
-                       lastCheckPoint = localDecl.sourceEnd + 1;
-                       currentElement = currentElement.add(localDecl, 0);
-               } else {
-                       FieldDeclaration fieldDecl = (FieldDeclaration) astStack[astPtr];
-                       lastCheckPoint = fieldDecl.sourceEnd + 1;
-                       currentElement = currentElement.add(fieldDecl, 0);
-               }
-               lastIgnoredToken = -1;
-       }
-}
-protected void consumeEqualityExpression(int op) {
-       // EqualityExpression ::= EqualityExpression '==' RelationalExpression
-       // EqualityExpression ::= EqualityExpression '!=' RelationalExpression
-
-       //optimize the push/pop
-
-       expressionPtr--;
-       expressionLengthPtr--;
-       expressionStack[expressionPtr] =
-               new EqualExpression(
-                       expressionStack[expressionPtr],
-                       expressionStack[expressionPtr + 1],
-                       op);
-}
-protected void consumeExitVariableWithInitialization() {
-       // ExitVariableWithInitialization ::= $empty
-       // do nothing by default
-       expressionLengthPtr--;
-       AbstractVariableDeclaration variableDecl = (AbstractVariableDeclaration) astStack[astPtr];
-       variableDecl.initialization = expressionStack[expressionPtr--];
-       // we need to update the declarationSourceEnd of the local variable declaration to the
-       // source end position of the initialization expression
-       variableDecl.declarationSourceEnd = variableDecl.initialization.sourceEnd;
-       variableDecl.declarationEnd = variableDecl.initialization.sourceEnd;
-}
-protected void consumeExitVariableWithoutInitialization() {
-       // ExitVariableWithoutInitialization ::= $empty
-       // do nothing by default
-}
-protected void consumeExplicitConstructorInvocation(int flag, int recFlag) {
-
-       /* flag allows to distinguish 3 cases :
-       (0) :   
-       ExplicitConstructorInvocation ::= 'this' '(' ArgumentListopt ')' ';'
-       ExplicitConstructorInvocation ::= 'super' '(' ArgumentListopt ')' ';'
-       (1) :
-       ExplicitConstructorInvocation ::= Primary '.' 'super' '(' ArgumentListopt ')' ';'
-       ExplicitConstructorInvocation ::= Primary '.' 'this' '(' ArgumentListopt ')' ';'
-       (2) :
-       ExplicitConstructorInvocation ::= Name '.' 'super' '(' ArgumentListopt ')' ';'
-       ExplicitConstructorInvocation ::= Name '.' 'this' '(' ArgumentListopt ')' ';'
-       */
-       int startPosition = intStack[intPtr--];
-       ExplicitConstructorCall ecc = new ExplicitConstructorCall(recFlag);
-       int length;
-       if ((length = expressionLengthStack[expressionLengthPtr--]) != 0) {
-               expressionPtr -= length;
-               System.arraycopy(expressionStack, expressionPtr + 1, ecc.arguments = new Expression[length], 0, length);
-       }
-       switch (flag) {
-               case 0 :
-                       ecc.sourceStart = startPosition;
-                       break;
-               case 1 :
-                       expressionLengthPtr--;
-                       ecc.sourceStart = (ecc.qualification = expressionStack[expressionPtr--]).sourceStart;
-                       break;
-               case 2 :
-                       ecc.sourceStart = (ecc.qualification = getUnspecifiedReferenceOptimized()).sourceStart;
-                       break;
-       };
-       pushOnAstStack(ecc);
-       ecc.sourceEnd = endPosition;
-}
-protected void consumeExpressionStatement() {
-       // ExpressionStatement ::= StatementExpression ';'
-       expressionLengthPtr--;
-       pushOnAstStack(expressionStack[expressionPtr--]);
-}
-protected void consumeFieldAccess(boolean isSuperAccess) {
-       // FieldAccess ::= Primary '.' 'Identifier'
-       // FieldAccess ::= 'super' '.' 'Identifier'
-
-       FieldReference fr =
-               new FieldReference(
-                       identifierStack[identifierPtr],
-                       identifierPositionStack[identifierPtr--]);
-       identifierLengthPtr--;
-       if (isSuperAccess) {
-               //considerates the fieldReference beginning at the 'super' .... 
-               fr.sourceStart = intStack[intPtr--];
-               fr.receiver = new SuperReference(fr.sourceStart, endPosition);
-               pushOnExpressionStack(fr);
-       } else {
-               //optimize push/pop
-               if ((fr.receiver = expressionStack[expressionPtr]).isThis()) {
-                       //fieldreference begins at the this
-                       fr.sourceStart = fr.receiver.sourceStart;
-               }
-               expressionStack[expressionPtr] = fr;
-       }
-}
-protected void consumeFieldDeclaration() {
-       // See consumeLocalVariableDeclarationDefaultModifier() in case of change: duplicated code
-       // FieldDeclaration ::= Modifiersopt Type VariableDeclarators ';'
-
-       /*
-       astStack : 
-       expressionStack: Expression Expression ...... Expression
-       identifierStack : type  identifier identifier ...... identifier
-       intStack : typeDim      dim        dim               dim
-        ==>
-       astStack : FieldDeclaration FieldDeclaration ...... FieldDeclaration
-       expressionStack :
-       identifierStack : 
-       intStack : 
-         
-       */
-       int variableDeclaratorsCounter = astLengthStack[astLengthPtr];
-
-       for (int i = variableDeclaratorsCounter - 1; i >= 0; i--) {
-               FieldDeclaration fieldDeclaration = (FieldDeclaration) astStack[astPtr - i];
-               fieldDeclaration.declarationSourceEnd = endStatementPosition; 
-               fieldDeclaration.declarationEnd = endStatementPosition; // semi-colon included
-       }
-       updateSourceDeclarationParts(variableDeclaratorsCounter);
-       int endPos = flushAnnotationsDefinedPriorTo(endStatementPosition);
-       if (endPos != endStatementPosition) {
-               for (int i = 0; i < variableDeclaratorsCounter; i++) {
-                       FieldDeclaration fieldDeclaration = (FieldDeclaration) astStack[astPtr - i];
-                       fieldDeclaration.declarationSourceEnd = endPos;
-               }
-       }
-       // update the astStack, astPtr and astLengthStack
-       int startIndex = astPtr - variablesCounter[nestedType] + 1;
-       System.arraycopy(
-               astStack, 
-               startIndex, 
-               astStack, 
-               startIndex - 1, 
-               variableDeclaratorsCounter); 
-       astPtr--; // remove the type reference
-       astLengthStack[--astLengthPtr] = variableDeclaratorsCounter;
-
-       // recovery
-       if (currentElement != null) {
-               lastCheckPoint = endPos + 1;
-               if (currentElement.parent != null && currentElement instanceof RecoveredField){
-                       currentElement = currentElement.parent;
-               }
-               restartRecovery = true;
-       }
-       variablesCounter[nestedType] = 0;
-}
-protected void consumeForceNoDiet() {
-       // ForceNoDiet ::= $empty
-       dietInt++;
-}
-protected void consumeForInit() {
-       // ForInit ::= StatementExpressionList
-       pushOnAstLengthStack(-1);
-}
-protected void consumeFormalParameter() {
-       // FormalParameter ::= Type VariableDeclaratorId ==> false
-       // FormalParameter ::= Modifiers Type VariableDeclaratorId ==> true
-       /*
-       astStack : 
-       identifierStack : type identifier
-       intStack : dim dim
-        ==>
-       astStack : Argument
-       identifierStack :  
-       intStack :  
-       */
-
-       identifierLengthPtr--;
-       char[] name = identifierStack[identifierPtr];
-       long namePositions = identifierPositionStack[identifierPtr--];
-       TypeReference type = getTypeReference(intStack[intPtr--] + intStack[intPtr--]);
-       int modifierPositions = intStack[intPtr--];
-       intPtr--;
-       Argument arg = 
-               new Argument(
-                       name, 
-                       namePositions, 
-                       type, 
-                       intStack[intPtr + 1] & ~AccDeprecated); // modifiers
-       arg.declarationSourceStart = modifierPositions;
-       pushOnAstStack(arg);
-
-       /* if incomplete method header, listLength counter will not have been reset,
-               indicating that some arguments are available on the stack */
-       listLength++;   
-}
-protected void consumeFormalParameterList() {
-       // FormalParameterList ::= FormalParameterList ',' FormalParameter
-       optimizedConcatNodeLists();
-}
-protected void consumeFormalParameterListopt() {
-       // FormalParameterListopt ::= $empty
-       pushOnAstLengthStack(0);
-}
-protected void consumeImportDeclarations() {
-       // ImportDeclarations ::= ImportDeclarations ImportDeclaration 
-       optimizedConcatNodeLists();
-}
-protected void consumeImportDeclarationsopt() {
-       // ImportDeclarationsopt ::= ImportDeclarations
-       int length;
-       if ((length = astLengthStack[astLengthPtr--]) != 0) {
-               astPtr -= length;
-               System.arraycopy(
-                       astStack,
-                       astPtr + 1,
-                       compilationUnit.imports = new ImportReference[length],
-                       0,
-                       length);
-       }
-}
-protected void consumeInstanceOfExpression(int op) {
-       // RelationalExpression ::= RelationalExpression 'instanceof' ReferenceType
-       //optimize the push/pop
-
-       //by construction, no base type may be used in getTypeReference
-       Expression exp;
-       expressionStack[expressionPtr] = exp =
-               new InstanceOfExpression(
-                       expressionStack[expressionPtr],
-                       getTypeReference(intStack[intPtr--]),
-                       op);
-       if (exp.sourceEnd == 0) {
-               //array on base type....
-               exp.sourceEnd = scanner.startPosition - 1;
-       }
-       //the scanner is on the next token already....
-}
-protected void consumeInterfaceDeclaration() {
-       // see consumeClassDeclaration in case of changes: duplicated code
-       // InterfaceDeclaration ::= InterfaceHeader InterfaceBody
-       int length;
-       if ((length = astLengthStack[astLengthPtr--]) != 0) {
-               //there are length declarations
-               //dispatch.....according to the type of the declarations
-               dispatchDeclarationInto(length);
-       }
-
-       TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
-       
-       // mark fields and initializer with local type mark if needed
-       markFieldsWithLocalType(typeDecl);
-
-       //convert constructor that do not have the type's name into methods
-       typeDecl.checkConstructors(this);
-       
-       //always add <clinit> (will be remove at code gen time if empty)
-       if (this.scanner.containsAssertKeyword) {
-               typeDecl.bits |= AstNode.AddAssertionMASK;
-       }
-       typeDecl.addClinit();
-       typeDecl.bodyEnd = endStatementPosition;
-       typeDecl.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition); 
-}
-protected void consumeInterfaceHeader() {
-       // InterfaceHeader ::= InterfaceHeaderName InterfaceHeaderExtendsopt
-
-       TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];  
-       if (currentToken == TokenNameLBRACE){ 
-               typeDecl.bodyStart = scanner.currentPosition;
-       }
-       if (currentElement != null){
-               restartRecovery = true; // used to avoid branching back into the regular automaton              
-       }
-       // flush the comments related to the interface header
-       scanner.commentPtr = -1;        
-}
-protected void consumeInterfaceHeaderExtends() {
-       // InterfaceHeaderExtends ::= 'extends' InterfaceTypeList
-       int length = astLengthStack[astLengthPtr--];
-       //super interfaces
-       astPtr -= length;
-       TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
-       System.arraycopy(
-               astStack, 
-               astPtr + 1, 
-               typeDecl.superInterfaces = new TypeReference[length], 
-               0, 
-               length); 
-       typeDecl.bodyStart = typeDecl.superInterfaces[length-1].sourceEnd + 1;          
-       listLength = 0; // reset after having read super-interfaces             
-       // recovery
-       if (currentElement != null) { 
-               lastCheckPoint = typeDecl.bodyStart;
-       }
-}
-protected void consumeInterfaceHeaderName() {
-       // InterfaceHeaderName ::= Modifiersopt 'interface' 'Identifier'
-       TypeDeclaration typeDecl;
-       if (nestedMethod[nestedType] == 0) {
-               if (nestedType != 0) {
-                       typeDecl = new MemberTypeDeclaration(this.compilationUnit.compilationResult);
-               } else {
-                       typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult);
-               }
-       } else {
-               // Record that the block has a declaration for local types
-               typeDecl = new LocalTypeDeclaration(this.compilationUnit.compilationResult);
-               markCurrentMethodWithLocalType();
-               blockReal();
-       }
-
-       //highlight the name of the type
-       long pos = identifierPositionStack[identifierPtr];
-       typeDecl.sourceEnd = (int) pos;
-       typeDecl.sourceStart = (int) (pos >>> 32);
-       typeDecl.name = identifierStack[identifierPtr--];
-       identifierLengthPtr--;
-
-       //compute the declaration source too
-       // 'class' and 'interface' push two int positions: the beginning of the class token and its end.
-       // we want to keep the beginning position but get rid of the end position
-       // it is only used for the ClassLiteralAccess positions.
-       typeDecl.declarationSourceStart = intStack[intPtr--];
-       intPtr--; // remove the end position of the class token
-       typeDecl.modifiersSourceStart = intStack[intPtr--];
-       typeDecl.modifiers = intStack[intPtr--];
-       if (typeDecl.modifiersSourceStart >= 0) {
-               typeDecl.declarationSourceStart = typeDecl.modifiersSourceStart;
-       }
-       typeDecl.bodyStart = typeDecl.sourceEnd + 1;
-       pushOnAstStack(typeDecl);
-       listLength = 0; // will be updated when reading super-interfaces
-       // recovery
-       if (currentElement != null){ // is recovering
-               lastCheckPoint = typeDecl.bodyStart;
-               currentElement = currentElement.add(typeDecl, 0);
-               lastIgnoredToken = -1;          
-       }
-}
-protected void consumeInterfaceMemberDeclarations() {
-       // InterfaceMemberDeclarations ::= InterfaceMemberDeclarations InterfaceMemberDeclaration
-       concatNodeLists();
-}
-protected void consumeInterfaceMemberDeclarationsopt() {
-       // InterfaceMemberDeclarationsopt ::= NestedType InterfaceMemberDeclarations
-       nestedType--;
-}
-protected void consumeInterfaceType() {
-       // InterfaceType ::= ClassOrInterfaceType
-       pushOnAstStack(getTypeReference(0));
-       /* if incomplete type header, listLength counter will not have been reset,
-               indicating that some interfaces are available on the stack */
-       listLength++;   
-}
-protected void consumeInterfaceTypeList() {
-       // InterfaceTypeList ::= InterfaceTypeList ',' InterfaceType
-       optimizedConcatNodeLists();
-}
-protected void consumeLeftHandSide() {
-       // LeftHandSide ::= Name
+      case 133 : // System.out.println("MethodDeclaration ::= MethodHeader MethodBody");
+        // set to true to consume a method with a body
+        consumeMethodDeclaration(true);
+        break;
+
+      case 134 : // System.out.println("AbstractMethodDeclaration ::= MethodHeader SEMICOLON");
+        // set to false to consume a method without body
+        consumeMethodDeclaration(false);
+        break;
+
+      case 135 : // System.out.println("MethodHeader ::= MethodHeaderName MethodHeaderParameters MethodHeaderExtendedDims");
+        consumeMethodHeader();
+        break;
+
+      case 136 : // System.out.println("MethodPushModifiersHeader ::= MethodPushModifiersHeaderName MethodHeaderParameters");
+        consumeMethodHeader();
+        break;
+
+      case 137 : // System.out.println("MethodPushModifiersHeaderName ::= Modifiers Type PushModifiers Identifier LPAREN");
+        consumeMethodPushModifiersHeaderName();
+        break;
+
+      case 138 : // System.out.println("MethodPushModifiersHeaderName ::= Type PushModifiers Identifier LPAREN");
+        consumeMethodPushModifiersHeaderName();
+        break;
+
+      case 139 : // System.out.println("MethodHeaderName ::= Modifiersopt Type Identifier LPAREN");
+        consumeMethodHeaderName();
+        break;
+
+      case 140 : // System.out.println("MethodHeaderParameters ::= FormalParameterListopt RPAREN");
+        consumeMethodHeaderParameters();
+        break;
+
+      case 141 : // System.out.println("MethodHeaderExtendedDims ::= Dimsopt");
+        consumeMethodHeaderExtendedDims();
+        break;
+
+      case 142 : // System.out.println("MethodHeaderThrowsClause ::= throws ClassTypeList");
+        consumeMethodHeaderThrowsClause();
+        break;
+
+      case 143 : // System.out.println("ConstructorHeader ::= ConstructorHeaderName MethodHeaderParameters...");
+        consumeConstructorHeader();
+        break;
+
+      case 144 : // System.out.println("ConstructorHeaderName ::= Modifiersopt Identifier LPAREN");
+        consumeConstructorHeaderName();
+        break;
+
+      case 146 : // System.out.println("FormalParameterList ::= FormalParameterList COMMA FormalParameter");
+        consumeFormalParameterList();
+        break;
+
+      case 147 : // System.out.println("FormalParameter ::= Modifiersopt Type VariableDeclaratorId");
+        // the boolean is used to know if the modifiers should be reset
+        consumeFormalParameter();
+        break;
 
-       pushOnExpressionStack(getUnspecifiedReferenceOptimized());
-}
-protected void consumeLeftParen() {
-       // PushLPAREN ::= '('
-       pushOnIntStack(lParenPos);
-}
-protected void consumeLocalVariableDeclaration() {
-       // LocalVariableDeclaration ::= Modifiers Type VariableDeclarators ';'
-
-       /*
-       astStack : 
-       expressionStack: Expression Expression ...... Expression
-       identifierStack : type  identifier identifier ...... identifier
-       intStack : typeDim      dim        dim               dim
-        ==>
-       astStack : FieldDeclaration FieldDeclaration ...... FieldDeclaration
-       expressionStack :
-       identifierStack : 
-       intStack : 
-         
-       */
-       int variableDeclaratorsCounter = astLengthStack[astLengthPtr];
-
-       // update the astStack, astPtr and astLengthStack
-       int startIndex = astPtr - variablesCounter[nestedType] + 1;
-       System.arraycopy(
-               astStack, 
-               startIndex, 
-               astStack, 
-               startIndex - 1, 
-               variableDeclaratorsCounter); 
-       astPtr--; // remove the type reference
-       astLengthStack[--astLengthPtr] = variableDeclaratorsCounter;
-       variablesCounter[nestedType] = 0;
-}
-protected void consumeLocalVariableDeclarationStatement() {
-       // LocalVariableDeclarationStatement ::= LocalVariableDeclaration ';'
-       // see blockReal in case of change: duplicated code
-       // increment the amount of declared variables for this block
-       realBlockStack[realBlockPtr]++;
-}
-protected void consumeMethodBody() {
-       // MethodBody ::= NestedMethod '{' BlockStatementsopt '}' 
-       nestedMethod[nestedType] --;
-}
-protected void consumeMethodDeclaration(boolean isNotAbstract) {
-       // MethodDeclaration ::= MethodHeader MethodBody
-       // AbstractMethodDeclaration ::= MethodHeader ';'
-
-       /*
-       astStack : modifiers arguments throws statements
-       identifierStack : type name
-       intStack : dim dim dim
-        ==>
-       astStack : MethodDeclaration
-       identifierStack :
-       intStack : 
-       */
-
-       int length;
-       if (isNotAbstract) {
-               // pop the position of the {  (body of the method) pushed in block decl
-               intPtr--;
-       }
-
-       int explicitDeclarations = 0;
-       Statement[] statements = null;
-       if (isNotAbstract) {
-               //statements
-               explicitDeclarations = realBlockStack[realBlockPtr--];
-               if ((length = astLengthStack[astLengthPtr--]) != 0)
-                       System.arraycopy(
-                               astStack, 
-                               (astPtr -= length) + 1, 
-                               statements = new Statement[length], 
-                               0, 
-                               length); 
-       }
-
-       // now we know that we have a method declaration at the top of the ast stack
-       MethodDeclaration md = (MethodDeclaration) astStack[astPtr];
-       md.statements = statements;
-       md.explicitDeclarations = explicitDeclarations;
-
-       // cannot be done in consumeMethodHeader because we have no idea whether or not there
-       // is a body when we reduce the method header
-       if (!isNotAbstract) { //remember the fact that the method has a semicolon body
-               md.modifiers |= AccSemicolonBody;
-       }
-       // store the endPosition (position just before the '}') in case there is
-       // a trailing comment behind the end of the method
-       md.bodyEnd = endPosition;
-       md.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition);
-}
-protected void consumeMethodHeader() {
-       // MethodHeader ::= MethodHeaderName MethodHeaderParameters MethodHeaderExtendedDims ThrowsClauseopt
-       // retrieve end position of method declarator
-       AbstractMethodDeclaration method = (AbstractMethodDeclaration)astStack[astPtr];
-
-       if (currentToken == TokenNameLBRACE){ 
-               method.bodyStart = scanner.currentPosition;
-       }
-       // recovery
-       if (currentElement != null){
-               if (currentToken == TokenNameSEMICOLON){
-                       method.modifiers |= AccSemicolonBody;                   
-                       method.declarationSourceEnd = scanner.currentPosition-1;
-                       method.bodyEnd = scanner.currentPosition-1;
-                       if (currentElement.parent != null){
-                               currentElement = currentElement.parent;
-                       }
-               }               
-               restartRecovery = true; // used to avoid branching back into the regular automaton
-       }               
-}
-protected void consumeMethodHeaderExtendedDims() {
-       // MethodHeaderExtendedDims ::= Dimsopt
-       // now we update the returnType of the method
-       MethodDeclaration md = (MethodDeclaration) astStack[astPtr];
-       int extendedDims = intStack[intPtr--];
-       if (extendedDims != 0) {
-               TypeReference returnType = md.returnType;
-               md.sourceEnd = endPosition;
-               int dims = returnType.dimensions() + extendedDims;
-               int baseType;
-               if ((baseType = identifierLengthStack[identifierLengthPtr + 1]) < 0) {
-                       //it was a baseType
-                       int sourceStart = returnType.sourceStart;
-                       int sourceEnd =  returnType.sourceEnd;
-                       returnType = TypeReference.baseTypeReference(-baseType, dims);
-                       returnType.sourceStart = sourceStart;
-                       returnType.sourceEnd = sourceEnd;
-                       md.returnType = returnType;
-               } else {
-                       md.returnType = this.copyDims(md.returnType, dims);
-               }
-               if (currentToken == TokenNameLBRACE){ 
-                       md.bodyStart = endPosition + 1;
-               }
-               // recovery
-               if (currentElement != null){
-                       lastCheckPoint = md.bodyStart;
-               }               
-       }
-}
-protected void consumeMethodHeaderName() {
-       // MethodHeaderName ::= Modifiersopt Type 'Identifier' '('
-       MethodDeclaration md = new MethodDeclaration(this.compilationUnit.compilationResult);
-
-       //name
-       md.selector = identifierStack[identifierPtr];
-       long selectorSource = identifierPositionStack[identifierPtr--];
-       identifierLengthPtr--;
-       //type
-       md.returnType = getTypeReference(intStack[intPtr--]);
-       //modifiers
-       md.declarationSourceStart = intStack[intPtr--];
-       md.modifiers = intStack[intPtr--];
-
-       //highlight starts at selector start
-       md.sourceStart = (int) (selectorSource >>> 32);
-       pushOnAstStack(md);
-       md.sourceEnd = lParenPos;
-       md.bodyStart = lParenPos+1;
-       listLength = 0; // initialize listLength before reading parameters/throws
-       
-       // recovery
-       if (currentElement != null){
-               if (currentElement instanceof RecoveredType 
-                       //|| md.modifiers != 0
-                       || (scanner.getLineNumber(md.returnType.sourceStart)
-                                       == scanner.getLineNumber(md.sourceStart))){
-                       lastCheckPoint = md.bodyStart;
-                       currentElement = currentElement.add(md, 0);
-                       lastIgnoredToken = -1;
-               } else {
-                       lastCheckPoint = md.sourceStart;
-                       restartRecovery = true;
-               }
-       }               
-}
-protected void consumeMethodHeaderParameters() {
-       // MethodHeaderParameters ::= FormalParameterListopt ')'
-       int length = astLengthStack[astLengthPtr--];
-       astPtr -= length;
-       AbstractMethodDeclaration md = (AbstractMethodDeclaration) astStack[astPtr];
-       md.sourceEnd =  rParenPos;
-       //arguments
-       if (length != 0) {
-               System.arraycopy(
-                       astStack, 
-                       astPtr + 1, 
-                       md.arguments = new Argument[length], 
-                       0, 
-                       length); 
-       }
-       md.bodyStart = rParenPos+1;
-       listLength = 0; // reset listLength after having read all parameters
-       // recovery
-       if (currentElement != null){
-               lastCheckPoint = md.bodyStart;
-               if (currentElement.parseTree() == md) return;
-
-               // might not have been attached yet - in some constructor scenarii
-               if (md.isConstructor()){
-                       if ((length != 0)
-                               || (currentToken == TokenNameLBRACE) 
-                               // || (currentToken == TokenNamethrows)
-        ){
-                               currentElement = currentElement.add(md, 0);
-                               lastIgnoredToken = -1;
-                       }       
-               }       
-       }       
-}
-protected void consumeMethodHeaderThrowsClause() {
-       // MethodHeaderThrowsClause ::= 'throws' ClassTypeList
-       int length = astLengthStack[astLengthPtr--];
-       astPtr -= length;
-       AbstractMethodDeclaration md = (AbstractMethodDeclaration) astStack[astPtr];
-       System.arraycopy(
-               astStack, 
-               astPtr + 1, 
-               md.thrownExceptions = new TypeReference[length], 
-               0, 
-               length);
-       md.sourceEnd =  md.thrownExceptions[length-1].sourceEnd;
-       md.bodyStart = md.thrownExceptions[length-1].sourceEnd + 1;
-       listLength = 0; // reset listLength after having read all thrown exceptions     
-       // recovery
-       if (currentElement != null){
-               lastCheckPoint = md.bodyStart;
-       }               
-}
-protected void consumeMethodInvocationName() {
-       // MethodInvocation ::= Name '(' ArgumentListopt ')'
-
-       // when the name is only an identifier...we have a message send to "this" (implicit)
-
-       MessageSend m = newMessageSend();
-       m.sourceEnd = rParenPos;
-       m.sourceStart = 
-               (int) ((m.nameSourcePosition = identifierPositionStack[identifierPtr]) >>> 32); 
-       m.selector = identifierStack[identifierPtr--];
-       if (identifierLengthStack[identifierLengthPtr] == 1) {
-               m.receiver = ThisReference.ThisImplicit;
-               identifierLengthPtr--;
-       } else {
-               identifierLengthStack[identifierLengthPtr]--;
-               m.receiver = getUnspecifiedReference();
-               m.sourceStart = m.receiver.sourceStart;         
-       }
-       pushOnExpressionStack(m);
-}
-protected void consumeMethodInvocationPrimary() {
-       //optimize the push/pop
-       //MethodInvocation ::= Primary '.' 'Identifier' '(' ArgumentListopt ')'
-
-       MessageSend m = newMessageSend();
-       m.sourceStart = 
-               (int) ((m.nameSourcePosition = identifierPositionStack[identifierPtr]) >>> 32); 
-       m.selector = identifierStack[identifierPtr--];
-       identifierLengthPtr--;
-       m.receiver = expressionStack[expressionPtr];
-       m.sourceStart = m.receiver.sourceStart;
-       m.sourceEnd = rParenPos;
-       expressionStack[expressionPtr] = m;
-}
-protected void consumeMethodInvocationSuper() {
-       // MethodInvocation ::= 'super' '.' 'Identifier' '(' ArgumentListopt ')'
-
-       MessageSend m = newMessageSend();
-       m.sourceStart = intStack[intPtr--];
-       m.sourceEnd = rParenPos;
-       m.nameSourcePosition = identifierPositionStack[identifierPtr];
-       m.selector = identifierStack[identifierPtr--];
-       identifierLengthPtr--;
-       m.receiver = new SuperReference(m.sourceStart, endPosition);
-       pushOnExpressionStack(m);
-}
-protected void consumeMethodPushModifiersHeaderName() {
-       // MethodPushModifiersHeaderName ::= Modifiers Type PushModifiers 'Identifier' '('
-       // MethodPushModifiersHeaderName ::= Type PushModifiers 'Identifier' '(' 
-       MethodDeclaration md = new MethodDeclaration(this.compilationUnit.compilationResult);
-
-       //name
-       md.selector = identifierStack[identifierPtr];
-       long selectorSource = identifierPositionStack[identifierPtr--];
-       identifierLengthPtr--;
-
-       //modifiers
-       md.declarationSourceStart = intStack[intPtr--];
-       md.modifiers = intStack[intPtr--];
-
-       //type
-       md.returnType = getTypeReference(intStack[intPtr--]);
-
-       //highlight starts at selector start
-       md.sourceStart = (int) (selectorSource >>> 32);
-       pushOnAstStack(md);
-       md.sourceEnd = lParenPos;
-       md.bodyStart = lParenPos + 1;
-       listLength = 0; // initialize listLength before reading parameters/throws
-
-       // recovery
-       if (currentElement != null) {
-               lastCheckPoint = md.bodyStart;
-               currentElement = currentElement.add(md, 0);
-               lastIgnoredToken = -1;          
-       }
-}
-protected void consumeModifiers() {
-       int savedModifiersSourceStart = modifiersSourceStart;   
-       checkAnnotation(); // might update modifiers with AccDeprecated
-       pushOnIntStack(modifiers); // modifiers
-       if (modifiersSourceStart >= savedModifiersSourceStart) {
-               modifiersSourceStart = savedModifiersSourceStart;
-       }
-       pushOnIntStack(modifiersSourceStart);
-       resetModifiers();
-}
-protected void consumeNestedMethod() {
-       // NestedMethod ::= $empty
-       jumpOverMethodBody();
-       nestedMethod[nestedType] ++;
-       consumeOpenBlock();
-}
-protected void consumeNestedType() {
-       // NestedType ::= $empty
-       nestedType++;
-       try {
-               nestedMethod[nestedType] = 0;
-       } catch (IndexOutOfBoundsException e) {
-               //except in test's cases, it should never raise
-               int oldL = nestedMethod.length;
-               System.arraycopy(nestedMethod , 0, (nestedMethod = new int[oldL + 30]), 0, oldL);
-               nestedMethod[nestedType] = 0;
-               // increase the size of the fieldsCounter as well. It has to be consistent with the size of the nestedMethod collection
-               System.arraycopy(variablesCounter, 0, (variablesCounter = new int[oldL + 30]), 0, oldL);
-       }
-       variablesCounter[nestedType] = 0;
-}
-protected void consumeOneDimLoop() {
-       // OneDimLoop ::= '[' ']'
-       dimensions++;
-}
-protected void consumeOnlySynchronized() {
-       // OnlySynchronized ::= 'synchronized'
-       pushOnIntStack(this.synchronizedBlockSourceStart);
-       resetModifiers();
-}
-protected void consumeOpenBlock() {
-       // OpenBlock ::= $empty
-
-       pushOnIntStack(scanner.startPosition);
-       try {
-               realBlockStack[++realBlockPtr] = 0;
-       } catch (IndexOutOfBoundsException e) {
-               //realBlockPtr is correct 
-               int oldStackLength = realBlockStack.length;
-               int oldStack[] = realBlockStack;
-               realBlockStack = new int[oldStackLength + StackIncrement];
-               System.arraycopy(oldStack, 0, realBlockStack, 0, oldStackLength);
-               realBlockStack[realBlockPtr] = 0;
-       }
-}
-protected void consumePackageDeclaration() {
-       // PackageDeclaration ::= 'package' Name ';'
-       /* build an ImportRef build from the last name 
-       stored in the identifier stack. */
-
-       ImportReference impt = compilationUnit.currentPackage;
-       // flush annotations defined prior to import statements
-       impt.declarationEnd = endStatementPosition;
-       impt.declarationSourceEnd = this.flushAnnotationsDefinedPriorTo(impt.declarationSourceEnd);
-}
-protected void consumePackageDeclarationName() {
-       // PackageDeclarationName ::= 'package' Name
-       /* build an ImportRef build from the last name 
-       stored in the identifier stack. */
-
-       ImportReference impt;
-       int length;
-       char[][] tokens = 
-               new char[length = identifierLengthStack[identifierLengthPtr--]][]; 
-       identifierPtr -= length;
-       long[] positions = new long[length];
-       System.arraycopy(identifierStack, ++identifierPtr, tokens, 0, length);
-       System.arraycopy(
-               identifierPositionStack, 
-               identifierPtr--, 
-               positions, 
-               0, 
-               length); 
-       compilationUnit.currentPackage = 
-               impt = new ImportReference(tokens, positions, true); 
-
-       if (currentToken == TokenNameSEMICOLON){
-               impt.declarationSourceEnd = scanner.currentPosition - 1;
-       } else {
-               impt.declarationSourceEnd = impt.sourceEnd;
-       }
-       impt.declarationEnd = impt.declarationSourceEnd;
-       //endPosition is just before the ;
-       impt.declarationSourceStart = intStack[intPtr--];
-
-       // recovery
-       if (currentElement != null){
-               lastCheckPoint = impt.declarationSourceEnd+1;
-               restartRecovery = true; // used to avoid branching back into the regular automaton              
-       }       
-}
-protected void consumePostfixExpression() {
-       // PostfixExpression ::= Name
-       pushOnExpressionStack(getUnspecifiedReferenceOptimized());
-}
-protected void consumePrimaryNoNewArray() {
-       // PrimaryNoNewArray ::=  PushLPAREN Expression PushRPAREN 
-       updateSourcePosition(expressionStack[expressionPtr]);
-}
-protected void consumePrimaryNoNewArrayArrayType() {
-       // PrimaryNoNewArray ::= ArrayType '.' 'class'
-       intPtr--;
-       pushOnExpressionStack(
-               new ClassLiteralAccess(intStack[intPtr--],
-               getTypeReference(intStack[intPtr--])));
-}
-protected void consumePrimaryNoNewArrayName() {
-       // PrimaryNoNewArray ::= Name '.' 'class'
-       intPtr--;
-       pushOnExpressionStack(
-               new ClassLiteralAccess(intStack[intPtr--],
-               getTypeReference(0)));
-}
-protected void consumePrimaryNoNewArrayNameSuper() {
-       // PrimaryNoNewArray ::= Name '.' 'super'
-       pushOnExpressionStack(
-               new QualifiedSuperReference(
-                       getTypeReference(0),
-                       intStack[intPtr--],
-                       endPosition));
-}
-protected void consumePrimaryNoNewArrayNameThis() {
-       // PrimaryNoNewArray ::= Name '.' 'this'
-       pushOnExpressionStack(
-               new QualifiedThisReference(
-                       getTypeReference(0),
-                       intStack[intPtr--],
-                       endPosition));
-}
-protected void consumePrimaryNoNewArrayPrimitiveType() {
-       // PrimaryNoNewArray ::= PrimitiveType '.' 'class'
-       intPtr--;
-       pushOnExpressionStack(
-               new ClassLiteralAccess(intStack[intPtr--],
-               getTypeReference(0)));
-}
-protected void consumePrimaryNoNewArrayThis() {
-       // PrimaryNoNewArray ::= 'this'
-       pushOnExpressionStack(new ThisReference(intStack[intPtr--], endPosition));
-}
-protected void consumePrimitiveType() {
-       // Type ::= PrimitiveType
-       pushOnIntStack(0);
-}
-protected void consumePushModifiers() {
-       if ((modifiers & AccSynchronized) != 0) {
-                /* remove the starting position of the synchronized keyword
-                 * we don't need it when synchronized is part of the modifiers
-                 */
-               intPtr--;
-       }
-       pushOnIntStack(modifiers); // modifiers
-       pushOnIntStack(modifiersSourceStart);
-       resetModifiers();
-}
-protected void consumePushPosition() {
-       // for source managment purpose
-       // PushPosition ::= $empty
-       pushOnIntStack(endPosition);
-}
-protected void consumeQualifiedName() {
-       // QualifiedName ::= Name '.' SimpleName 
-       /*back from the recursive loop of QualifiedName.
-       Updates identifier length into the length stack*/
+      case 149 : // System.out.println("ClassTypeList ::= ClassTypeList COMMA ClassTypeElt");
+        consumeClassTypeList();
+        break;
 
-       identifierLengthStack[--identifierLengthPtr]++;
-}
-protected void consumeReferenceType() {
-       // ReferenceType ::= ClassOrInterfaceType
-       pushOnIntStack(0);
-}
-protected void consumeRestoreDiet() {
-       // RestoreDiet ::= $empty
-       dietInt--;
-}
-protected void consumeRightParen() {
-       // PushRPAREN ::= ')'
-       pushOnIntStack(rParenPos);
-}
-       // This method is part of an automatic generation : do NOT edit-modify  
-        // This method is part of an automatic generation : do NOT edit-modify  
-       protected void consumeRule(int act) {
-         switch ( act ) {
-           case 29 : // System.out.println("Type ::= PrimitiveType");
-                           consumePrimitiveType();  
-                               break ;
-        
-           case 43 : // System.out.println("ReferenceType ::= ClassOrInterfaceType");
-                           consumeReferenceType();   
-                               break ;
-        
-           case 52 : // System.out.println("QualifiedName ::= Name DOT SimpleName");
-                           consumeQualifiedName();  
-                               break ;
-        
-           case 53 : // System.out.println("CompilationUnit ::= EnterCompilationUnit PackageDeclarationopt ImportDeclarationsopt");
-                           consumeCompilationUnit();  
-                               break ;
-        
-           case 54 : // System.out.println("EnterCompilationUnit ::=");
-                           consumeEnterCompilationUnit();  
-                               break ;
-        
-           case 66 : // System.out.println("CatchHeader ::= catch LPAREN FormalParameter RPAREN LBRACE");
-                           consumeCatchHeader();  
-                               break ;
-        
-           case 68 : // System.out.println("ImportDeclarations ::= ImportDeclarations ImportDeclaration");
-                           consumeImportDeclarations();  
-                               break ;
-        
-           case 70 : // System.out.println("TypeDeclarations ::= TypeDeclarations TypeDeclaration");
-                           consumeTypeDeclarations();  
-                               break ;
-        
-           case 71 : // System.out.println("PackageDeclaration ::= PackageDeclarationName SEMICOLON");
-                            consumePackageDeclaration();  
-                               break ;
-        
-           case 72 : // System.out.println("PackageDeclarationName ::= package Name");
-                            consumePackageDeclarationName();  
-                               break ;
-        
-           case 75 : // System.out.println("SingleTypeImportDeclaration ::= SingleTypeImportDeclarationName SEMICOLON");
-                           consumeSingleTypeImportDeclaration();  
-                               break ;
-        
-           case 76 : // System.out.println("SingleTypeImportDeclarationName ::= import Name");
-                           consumeSingleTypeImportDeclarationName();  
-                               break ;
-        
-           case 77 : // System.out.println("TypeImportOnDemandDeclaration ::= TypeImportOnDemandDeclarationName SEMICOLON");
-                           consumeTypeImportOnDemandDeclaration();  
-                               break ;
-        
-           case 78 : // System.out.println("TypeImportOnDemandDeclarationName ::= import Name DOT MULTIPLY");
-                           consumeTypeImportOnDemandDeclarationName();  
-                               break ;
-        
-            case 81 : // System.out.println("TypeDeclaration ::= SEMICOLON");
-                           consumeEmptyTypeDeclaration();  
-                               break ;
-        
-           case 95 : // System.out.println("ClassDeclaration ::= ClassHeader ClassBody");
-                           consumeClassDeclaration();  
-                               break ;
-        
-           case 96 : // System.out.println("ClassHeader ::= ClassHeaderName ClassHeaderExtendsopt ClassHeaderImplementsopt");
-                           consumeClassHeader();  
-                               break ;
-        
-           case 97 : // System.out.println("ClassHeaderName ::= Modifiersopt class Identifier");
-                           consumeClassHeaderName();  
-                               break ;
-        
-           case 98 : // System.out.println("ClassHeaderExtends ::= extends ClassType");
-                           consumeClassHeaderExtends();  
-                               break ;
-        
-           case 99 : // System.out.println("ClassHeaderImplements ::= implements InterfaceTypeList");
-                           consumeClassHeaderImplements();  
-                               break ;
-        
-           case 101 : // System.out.println("InterfaceTypeList ::= InterfaceTypeList COMMA InterfaceType");
-                           consumeInterfaceTypeList();  
-                               break ;
-        
-           case 102 : // System.out.println("InterfaceType ::= ClassOrInterfaceType");
-                           consumeInterfaceType();  
-                               break ;
-        
-           case 105 : // System.out.println("ClassBodyDeclarations ::= ClassBodyDeclarations ClassBodyDeclaration");
-                           consumeClassBodyDeclarations();  
-                               break ;
-        
-           case 109 : // System.out.println("ClassBodyDeclaration ::= Diet NestedMethod Block");
-                           consumeClassBodyDeclaration();  
-                               break ;
-        
-           case 110 : // System.out.println("Diet ::=");
-                           consumeDiet();  
-                               break ;
-       
-           case 111 : // System.out.println("Initializer ::= Diet NestedMethod Block");
-                           consumeClassBodyDeclaration();  
-                               break ;
-        
-           case 118 : // System.out.println("ClassMemberDeclaration ::= SEMICOLON");
-                           consumeEmptyClassMemberDeclaration();  
-                               break ;
-       
-           case 119 : // System.out.println("FieldDeclaration ::= Modifiersopt Type VariableDeclarators SEMICOLON");
-                           consumeFieldDeclaration();  
-                               break ;
-        
-           case 121 : // System.out.println("VariableDeclarators ::= VariableDeclarators COMMA VariableDeclarator");
-                           consumeVariableDeclarators();  
-                               break ;
-        
-           case 124 : // System.out.println("EnterVariable ::=");
-                           consumeEnterVariable();  
-                               break ;
-        
-           case 125 : // System.out.println("ExitVariableWithInitialization ::=");
-                           consumeExitVariableWithInitialization();  
-                               break ;
-        
-           case 126 : // System.out.println("ExitVariableWithoutInitialization ::=");
-                           consumeExitVariableWithoutInitialization();  
-                               break ;
-        
-           case 127 : // System.out.println("ForceNoDiet ::=");
-                           consumeForceNoDiet();  
-                               break ;
-        
-           case 128 : // System.out.println("RestoreDiet ::=");
-                           consumeRestoreDiet();  
-                               break ;
-        
-           case 133 : // System.out.println("MethodDeclaration ::= MethodHeader MethodBody");
-                           // set to true to consume a method with a body
-         consumeMethodDeclaration(true);   
-                               break ;
-        
-           case 134 : // System.out.println("AbstractMethodDeclaration ::= MethodHeader SEMICOLON");
-                           // set to false to consume a method without body
-         consumeMethodDeclaration(false);  
-                               break ;
-        
-           case 135 : // System.out.println("MethodHeader ::= MethodHeaderName MethodHeaderParameters MethodHeaderExtendedDims");
-                           consumeMethodHeader();  
-                               break ;
-        
-           case 136 : // System.out.println("MethodPushModifiersHeader ::= MethodPushModifiersHeaderName MethodHeaderParameters");
-                           consumeMethodHeader();  
-                               break ;
-        
-           case 137 : // System.out.println("MethodPushModifiersHeaderName ::= Modifiers Type PushModifiers Identifier LPAREN");
-                           consumeMethodPushModifiersHeaderName();  
-                               break ;
-        
-           case 138 : // System.out.println("MethodPushModifiersHeaderName ::= Type PushModifiers Identifier LPAREN");
-                           consumeMethodPushModifiersHeaderName();  
-                               break ;
-        
-           case 139 : // System.out.println("MethodHeaderName ::= Modifiersopt Type Identifier LPAREN");
-                           consumeMethodHeaderName();  
-                               break ;
-        
-           case 140 : // System.out.println("MethodHeaderParameters ::= FormalParameterListopt RPAREN");
-                           consumeMethodHeaderParameters();  
-                               break ;
-        
-           case 141 : // System.out.println("MethodHeaderExtendedDims ::= Dimsopt");
-                           consumeMethodHeaderExtendedDims();  
-                               break ;
-        
-           case 142 : // System.out.println("MethodHeaderThrowsClause ::= throws ClassTypeList");
-                           consumeMethodHeaderThrowsClause();  
-                               break ;
-        
-           case 143 : // System.out.println("ConstructorHeader ::= ConstructorHeaderName MethodHeaderParameters...");
-                           consumeConstructorHeader();  
-                               break ;
-        
-           case 144 : // System.out.println("ConstructorHeaderName ::= Modifiersopt Identifier LPAREN");
-                           consumeConstructorHeaderName();  
-                               break ;
-        
-           case 146 : // System.out.println("FormalParameterList ::= FormalParameterList COMMA FormalParameter");
-                           consumeFormalParameterList();  
-                               break ;
-        
-           case 147 : // System.out.println("FormalParameter ::= Modifiersopt Type VariableDeclaratorId");
-                           // the boolean is used to know if the modifiers should be reset
-               consumeFormalParameter();  
-                               break ;
-        
-           case 149 : // System.out.println("ClassTypeList ::= ClassTypeList COMMA ClassTypeElt");
-                           consumeClassTypeList();  
-                               break ;
-        
-           case 150 : // System.out.println("ClassTypeElt ::= ClassType");
-                           consumeClassTypeElt();  
-                               break ;
-        
-           case 151 : // System.out.println("MethodBody ::= NestedMethod LBRACE BlockStatementsopt RBRACE");
-                           consumeMethodBody();  
-                               break ;
-        
-           case 152 : // System.out.println("NestedMethod ::=");
-                           consumeNestedMethod();  
-                               break ;
-        
-           case 153 : // System.out.println("StaticInitializer ::= StaticOnly Block");
-                           consumeStaticInitializer();  
-                               break ;
-       
-           case 154 : // System.out.println("StaticOnly ::= static");
-                           consumeStaticOnly();  
-                               break ;
-        
-           case 155 : // System.out.println("ConstructorDeclaration ::= ConstructorHeader ConstructorBody");
-                           consumeConstructorDeclaration() ;  
-                               break ;
-        
-           case 156 : // System.out.println("ConstructorDeclaration ::= ConstructorHeader SEMICOLON");
-                           consumeInvalidConstructorDeclaration() ;  
-                               break ;
-        
-           case 157 : // System.out.println("ConstructorBody ::= NestedMethod LBRACE ConstructorBlockStatementsopt RBRACE");
-                           consumeConstructorBody();  
-                               break ;
-        
-           case 160 : // System.out.println("ConstructorBlockStatementsopt ::= ExplicitConstructorInvocation BlockStatements");
-                            consumeConstructorBlockStatements();  
-                               break ;
-        
-           case 161 : // System.out.println("ExplicitConstructorInvocation ::= this LPAREN ArgumentListopt RPAREN SEMICOLON");
-                           consumeExplicitConstructorInvocation(0,ExplicitConstructorCall.This);  
-                               break ;
-        
-           case 162 : // System.out.println("ExplicitConstructorInvocation ::= super LPAREN ArgumentListopt RPAREN SEMICOLON");
-                           consumeExplicitConstructorInvocation(0,ExplicitConstructorCall.Super);  
-                               break ;
-        
-           case 163 : // System.out.println("ExplicitConstructorInvocation ::= Primary DOT super LPAREN ArgumentListopt RPAREN");
-                           consumeExplicitConstructorInvocation(1, ExplicitConstructorCall.Super);  
-                               break ;
-        
-           case 164 : // System.out.println("ExplicitConstructorInvocation ::= Name DOT super LPAREN ArgumentListopt RPAREN...");
-                           consumeExplicitConstructorInvocation(2, ExplicitConstructorCall.Super);  
-                               break ;
-        
-           case 165 : // System.out.println("ExplicitConstructorInvocation ::= Primary DOT this LPAREN ArgumentListopt RPAREN...");
-                           consumeExplicitConstructorInvocation(1, ExplicitConstructorCall.This);  
-                               break ;
-        
-           case 166 : // System.out.println("ExplicitConstructorInvocation ::= Name DOT this LPAREN ArgumentListopt RPAREN...");
-                           consumeExplicitConstructorInvocation(2, ExplicitConstructorCall.This);  
-                               break ;
-        
-           case 167 : // System.out.println("InterfaceDeclaration ::= InterfaceHeader InterfaceBody");
-                           consumeInterfaceDeclaration();  
-                               break ;
-        
-           case 168 : // System.out.println("InterfaceHeader ::= InterfaceHeaderName InterfaceHeaderExtendsopt");
-                           consumeInterfaceHeader();  
-                               break ;
-        
-           case 169 : // System.out.println("InterfaceHeaderName ::= Modifiersopt interface Identifier");
-                           consumeInterfaceHeaderName();  
-                               break ;
-        
-           case 171 : // System.out.println("InterfaceHeaderExtends ::= extends InterfaceTypeList");
-                           consumeInterfaceHeaderExtends();  
-                               break ;
-        
-           case 174 : // System.out.println("InterfaceMemberDeclarations ::= InterfaceMemberDeclarations...");
-                           consumeInterfaceMemberDeclarations();  
-                               break ;
-        
-           case 175 : // System.out.println("InterfaceMemberDeclaration ::= SEMICOLON");
-                           consumeEmptyInterfaceMemberDeclaration();  
-                               break ;
-        
-           case 178 : // System.out.println("InterfaceMemberDeclaration ::= InvalidMethodDeclaration");
-                           ignoreMethodBody();  
-                               break ;
-        
-           case 179 : // System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader ConstructorBody");
-                           ignoreInvalidConstructorDeclaration(true);   
-                               break ;
-        
-           case 180 : // System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader SEMICOLON");
-                           ignoreInvalidConstructorDeclaration(false);   
-                               break ;
-        
-           case 186 : // System.out.println("ArrayInitializer ::= LBRACE ,opt RBRACE");
-                           consumeEmptyArrayInitializer();  
-                               break ;
-        
-           case 187 : // System.out.println("ArrayInitializer ::= LBRACE VariableInitializers RBRACE");
-                           consumeArrayInitializer();  
-                               break ;
-        
-           case 188 : // System.out.println("ArrayInitializer ::= LBRACE VariableInitializers COMMA RBRACE");
-                           consumeArrayInitializer();  
-                               break ;
-        
-           case 190 : // System.out.println("VariableInitializers ::= VariableInitializers COMMA VariableInitializer");
-                           consumeVariableInitializers();  
-                               break ;
-        
-           case 191 : // System.out.println("Block ::= OpenBlock LBRACE BlockStatementsopt RBRACE");
-                           consumeBlock();  
-                               break ;
-        
-           case 192 : // System.out.println("OpenBlock ::=");
-                           consumeOpenBlock() ;  
-                               break ;
-        
-           case 194 : // System.out.println("BlockStatements ::= BlockStatements BlockStatement");
-                           consumeBlockStatements() ;  
-                               break ;
-        
-           case 198 : // System.out.println("BlockStatement ::= InvalidInterfaceDeclaration");
-                           ignoreInterfaceDeclaration();  
-                               break ;
-        
-           case 199 : // System.out.println("LocalVariableDeclarationStatement ::= LocalVariableDeclaration SEMICOLON");
-                           consumeLocalVariableDeclarationStatement();  
-                               break ;
-        
-           case 200 : // System.out.println("LocalVariableDeclaration ::= Type PushModifiers VariableDeclarators");
-                           consumeLocalVariableDeclaration();  
-                               break ;
-        
-           case 201 : // System.out.println("LocalVariableDeclaration ::= Modifiers Type PushModifiers VariableDeclarators");
-                           consumeLocalVariableDeclaration();  
-                               break ;
-        
-           case 202 : // System.out.println("PushModifiers ::=");
-                           consumePushModifiers();  
-                               break ;
-        
-           case 226 : // System.out.println("EmptyStatement ::= SEMICOLON");
-                           consumeEmptyStatement();  
-                               break ;
-        
-           case 227 : // System.out.println("LabeledStatement ::= Identifier COLON Statement");
-                           consumeStatementLabel() ;  
-                               break ;
-        
-           case 228 : // System.out.println("LabeledStatementNoShortIf ::= Identifier COLON StatementNoShortIf");
-                           consumeStatementLabel() ;  
-                               break ;
-        
-            case 229 : // System.out.println("ExpressionStatement ::= StatementExpression SEMICOLON");
-                           consumeExpressionStatement();  
-                               break ;
-        
-           case 237 : // System.out.println("IfThenStatement ::= if LPAREN Expression RPAREN Statement");
-                           consumeStatementIfNoElse();  
-                               break ;
-        
-           case 238 : // System.out.println("IfThenElseStatement ::= if LPAREN Expression RPAREN StatementNoShortIf else...");
-                           consumeStatementIfWithElse();  
-                               break ;
-        
-           case 239 : // System.out.println("IfThenElseStatementNoShortIf ::= if LPAREN Expression RPAREN StatementNoShortIf...");
-                           consumeStatementIfWithElse();  
-                               break ;
-        
-           case 240 : // System.out.println("SwitchStatement ::= switch OpenBlock LPAREN Expression RPAREN SwitchBlock");
-                           consumeStatementSwitch() ;  
-                               break ;
-        
-           case 241 : // System.out.println("SwitchBlock ::= LBRACE RBRACE");
-                           consumeEmptySwitchBlock() ;  
-                               break ;
-        
-           case 244 : // System.out.println("SwitchBlock ::= LBRACE SwitchBlockStatements SwitchLabels RBRACE");
-                           consumeSwitchBlock() ;  
-                               break ;
-        
-           case 246 : // System.out.println("SwitchBlockStatements ::= SwitchBlockStatements SwitchBlockStatement");
-                           consumeSwitchBlockStatements() ;  
-                               break ;
-        
-           case 247 : // System.out.println("SwitchBlockStatement ::= SwitchLabels BlockStatements");
-                           consumeSwitchBlockStatement() ;  
-                               break ;
-        
-           case 249 : // System.out.println("SwitchLabels ::= SwitchLabels SwitchLabel");
-                           consumeSwitchLabels() ;  
-                               break ;
-        
-            case 250 : // System.out.println("SwitchLabel ::= case ConstantExpression COLON");
-                           consumeCaseLabel();  
-                               break ;
-        
-            case 251 : // System.out.println("SwitchLabel ::= default COLON");
-                           consumeDefaultLabel();  
-                               break ;
-        
-           case 252 : // System.out.println("WhileStatement ::= while LPAREN Expression RPAREN Statement");
-                           consumeStatementWhile() ;  
-                               break ;
-        
-           case 253 : // System.out.println("WhileStatementNoShortIf ::= while LPAREN Expression RPAREN StatementNoShortIf");
-                           consumeStatementWhile() ;  
-                               break ;
-        
-           case 254 : // System.out.println("DoStatement ::= do Statement while LPAREN Expression RPAREN SEMICOLON");
-                           consumeStatementDo() ;  
-                               break ;
-        
-           case 255 : // System.out.println("ForStatement ::= for LPAREN ForInitopt SEMICOLON Expressionopt SEMICOLON...");
-                           consumeStatementFor() ;  
-                               break ;
-        
-           case 256 : // System.out.println("ForStatementNoShortIf ::= for LPAREN ForInitopt SEMICOLON Expressionopt SEMICOLON");
-                           consumeStatementFor() ;  
-                               break ;
-        
-           case 257 : // System.out.println("ForInit ::= StatementExpressionList");
-                           consumeForInit() ;  
-                               break ;
-        
-           case 261 : // System.out.println("StatementExpressionList ::= StatementExpressionList COMMA StatementExpression");
-                           consumeStatementExpressionList() ;  
-                               break ;
-        
-           case 262 : // System.out.println("AssertStatement ::= assert Expression SEMICOLON");
-                           consumeSimpleAssertStatement() ;  
-                               break ;
-        
-           case 263 : // System.out.println("AssertStatement ::= assert Expression COLON Expression SEMICOLON");
-                           consumeAssertStatement() ;  
-                               break ;
-        
-           case 264 : // System.out.println("BreakStatement ::= break SEMICOLON");
-                           consumeStatementBreak() ;  
-                               break ;
-        
-           case 265 : // System.out.println("BreakStatement ::= break Identifier SEMICOLON");
-                           consumeStatementBreakWithLabel() ;  
-                               break ;
-        
-           case 266 : // System.out.println("ContinueStatement ::= continue SEMICOLON");
-                           consumeStatementContinue() ;  
-                               break ;
-        
-           case 267 : // System.out.println("ContinueStatement ::= continue Identifier SEMICOLON");
-                           consumeStatementContinueWithLabel() ;  
-                               break ;
-        
-           case 268 : // System.out.println("ReturnStatement ::= return Expressionopt SEMICOLON");
-                           consumeStatementReturn() ;  
-                               break ;
-        
-           case 269 : // System.out.println("ThrowStatement ::= throw Expression SEMICOLON");
-                           consumeStatementThrow();
-        
-                               break ;
-        
-           case 270 : // System.out.println("SynchronizedStatement ::= OnlySynchronized LPAREN Expression RPAREN Block");
-                           consumeStatementSynchronized();  
-                               break ;
-        
-           case 271 : // System.out.println("OnlySynchronized ::= synchronized");
-                           consumeOnlySynchronized();  
-                               break ;
-        
-           case 272 : // System.out.println("TryStatement ::= try Block Catches");
-                           consumeStatementTry(false);  
-                               break ;
-        
-           case 273 : // System.out.println("TryStatement ::= try Block Catchesopt Finally");
-                           consumeStatementTry(true);  
-                               break ;
-        
-           case 275 : // System.out.println("Catches ::= Catches CatchClause");
-                           consumeCatches();  
-                               break ;
-        
-           case 276 : // System.out.println("CatchClause ::= catch LPAREN FormalParameter RPAREN Block");
-                           consumeStatementCatch() ;  
-                               break ;
-        
-           case 278 : // System.out.println("PushLPAREN ::= LPAREN");
-                           consumeLeftParen();  
-                               break ;
-        
-           case 279 : // System.out.println("PushRPAREN ::= RPAREN");
-                           consumeRightParen();  
-                               break ;
-        
-           case 283 : // System.out.println("PrimaryNoNewArray ::= this");
-                           consumePrimaryNoNewArrayThis();  
-                               break ;
-        
-           case 284 : // System.out.println("PrimaryNoNewArray ::= PushLPAREN Expression PushRPAREN");
-                           consumePrimaryNoNewArray();  
-                               break ;
-        
-           case 287 : // System.out.println("PrimaryNoNewArray ::= Name DOT this");
-                           consumePrimaryNoNewArrayNameThis();  
-                               break ;
-        
-           case 288 : // System.out.println("PrimaryNoNewArray ::= Name DOT super");
-                           consumePrimaryNoNewArrayNameSuper();  
-                               break ;
-        
-           case 289 : // System.out.println("PrimaryNoNewArray ::= Name DOT class");
-                           consumePrimaryNoNewArrayName();  
-                               break ;
-        
-           case 290 : // System.out.println("PrimaryNoNewArray ::= ArrayType DOT class");
-                           consumePrimaryNoNewArrayArrayType();  
-                               break ;
-        
-           case 291 : // System.out.println("PrimaryNoNewArray ::= PrimitiveType DOT class");
-                           consumePrimaryNoNewArrayPrimitiveType();  
-                               break ;
-        
-           case 294 : // System.out.println("AllocationHeader ::= new ClassType LPAREN ArgumentListopt RPAREN");
-                           consumeAllocationHeader();  
-                               break ;
-        
-           case 295 : // System.out.println("ClassInstanceCreationExpression ::= new ClassType LPAREN ArgumentListopt RPAREN...");
-                           consumeClassInstanceCreationExpression();  
-                               break ;
-        
-           case 296 : // System.out.println("ClassInstanceCreationExpression ::= Primary DOT new SimpleName LPAREN...");
-                           consumeClassInstanceCreationExpressionQualified() ;  
-                               break ;
-        
-           case 297 : // System.out.println("ClassInstanceCreationExpression ::= ClassInstanceCreationExpressionName new...");
-                           consumeClassInstanceCreationExpressionQualified() ;  
-                               break ;
-        
-           case 298 : // System.out.println("ClassInstanceCreationExpressionName ::= Name DOT");
-                           consumeClassInstanceCreationExpressionName() ;  
-                               break ;
-        
-           case 299 : // System.out.println("ClassBodyopt ::=");
-                           consumeClassBodyopt();  
-                               break ;
-        
-           case 301 : // System.out.println("EnterAnonymousClassBody ::=");
-                           consumeEnterAnonymousClassBody();  
-                               break ;
-        
-           case 303 : // System.out.println("ArgumentList ::= ArgumentList COMMA Expression");
-                           consumeArgumentList();  
-                               break ;
-        
-           case 304 : // System.out.println("ArrayCreationExpression ::= new PrimitiveType DimWithOrWithOutExprs...");
-                           consumeArrayCreationExpression();  
-                               break ;
-        
-           case 305 : // System.out.println("ArrayCreationExpression ::= new ClassOrInterfaceType DimWithOrWithOutExprs...");
-                           consumeArrayCreationExpression();  
-                               break ;
-        
-           case 307 : // System.out.println("DimWithOrWithOutExprs ::= DimWithOrWithOutExprs DimWithOrWithOutExpr");
-                           consumeDimWithOrWithOutExprs();  
-                               break ;
-        
-            case 309 : // System.out.println("DimWithOrWithOutExpr ::= LBRACKET RBRACKET");
-                           consumeDimWithOrWithOutExpr();  
-                               break ;
-        
-            case 310 : // System.out.println("Dims ::= DimsLoop");
-                           consumeDims();  
-                               break ;
-        
-            case 313 : // System.out.println("OneDimLoop ::= LBRACKET RBRACKET");
-                           consumeOneDimLoop();  
-                               break ;
-        
-           case 314 : // System.out.println("FieldAccess ::= Primary DOT Identifier");
-                           consumeFieldAccess(false);  
-                               break ;
-        
-           case 315 : // System.out.println("FieldAccess ::= super DOT Identifier");
-                           consumeFieldAccess(true);  
-                               break ;
-        
-           case 316 : // System.out.println("MethodInvocation ::= Name LPAREN ArgumentListopt RPAREN");
-                           consumeMethodInvocationName();  
-                               break ;
-        
-           case 317 : // System.out.println("MethodInvocation ::= Primary DOT Identifier LPAREN ArgumentListopt RPAREN");
-                           consumeMethodInvocationPrimary();  
-                               break ;
-        
-           case 318 : // System.out.println("MethodInvocation ::= super DOT Identifier LPAREN ArgumentListopt RPAREN");
-                           consumeMethodInvocationSuper();  
-                               break ;
-        
-           case 319 : // System.out.println("ArrayAccess ::= Name LBRACKET Expression RBRACKET");
-                           consumeArrayAccess(true);  
-                               break ;
-        
-           case 320 : // System.out.println("ArrayAccess ::= PrimaryNoNewArray LBRACKET Expression RBRACKET");
-                           consumeArrayAccess(false);  
-                               break ;
-        
-           case 322 : // System.out.println("PostfixExpression ::= Name");
-                           consumePostfixExpression();  
-                               break ;
-        
-           case 325 : // System.out.println("PostIncrementExpression ::= PostfixExpression PLUS_PLUS");
-                           consumeUnaryExpression(OperatorExpression.PLUS,true);  
-                               break ;
-        
-           case 326 : // System.out.println("PostDecrementExpression ::= PostfixExpression MINUS_MINUS");
-                           consumeUnaryExpression(OperatorExpression.MINUS,true);  
-                               break ;
-        
-           case 327 : // System.out.println("PushPosition ::=");
-                           consumePushPosition();  
-                               break ;
-        
-           case 330 : // System.out.println("UnaryExpression ::= PLUS PushPosition UnaryExpression");
-                           consumeUnaryExpression(OperatorExpression.PLUS);  
-                               break ;
-        
-           case 331 : // System.out.println("UnaryExpression ::= MINUS PushPosition UnaryExpression");
-                           consumeUnaryExpression(OperatorExpression.MINUS);  
-                               break ;
-        
-           case 333 : // System.out.println("PreIncrementExpression ::= PLUS_PLUS PushPosition UnaryExpression");
-                           consumeUnaryExpression(OperatorExpression.PLUS,false);  
-                               break ;
-        
-           case 334 : // System.out.println("PreDecrementExpression ::= MINUS_MINUS PushPosition UnaryExpression");
-                           consumeUnaryExpression(OperatorExpression.MINUS,false);  
-                               break ;
-        
-           case 336 : // System.out.println("UnaryExpressionNotPlusMinus ::= TWIDDLE PushPosition UnaryExpression");
-                           consumeUnaryExpression(OperatorExpression.TWIDDLE);  
-                               break ;
-        
-           case 337 : // System.out.println("UnaryExpressionNotPlusMinus ::= NOT PushPosition UnaryExpression");
-                           consumeUnaryExpression(OperatorExpression.NOT);  
-                               break ;
-        
-           case 339 : // System.out.println("CastExpression ::= PushLPAREN PrimitiveType Dimsopt PushRPAREN UnaryExpression");
-                           consumeCastExpression();  
-                               break ;
-        
-           case 340 : // System.out.println("CastExpression ::= PushLPAREN Name Dims PushRPAREN UnaryExpressionNotPlusMinus");
-                           consumeCastExpression();  
-                               break ;
-        
-           case 341 : // System.out.println("CastExpression ::= PushLPAREN Expression PushRPAREN UnaryExpressionNotPlusMinus");
-                           consumeCastExpressionLL1();  
-                               break ;
-        
-           case 343 : // System.out.println("MultiplicativeExpression ::= MultiplicativeExpression MULTIPLY UnaryExpression");
-                           consumeBinaryExpression(OperatorExpression.MULTIPLY);  
-                               break ;
-        
-           case 344 : // System.out.println("MultiplicativeExpression ::= MultiplicativeExpression DIVIDE UnaryExpression");
-                           consumeBinaryExpression(OperatorExpression.DIVIDE);  
-                               break ;
-        
-           case 345 : // System.out.println("MultiplicativeExpression ::= MultiplicativeExpression REMAINDER UnaryExpression");
-                           consumeBinaryExpression(OperatorExpression.REMAINDER);  
-                               break ;
-        
-           case 347 : // System.out.println("AdditiveExpression ::= AdditiveExpression PLUS MultiplicativeExpression");
-                           consumeBinaryExpression(OperatorExpression.PLUS);  
-                               break ;
-        
-           case 348 : // System.out.println("AdditiveExpression ::= AdditiveExpression MINUS MultiplicativeExpression");
-                           consumeBinaryExpression(OperatorExpression.MINUS);  
-                               break ;
-        
-           case 350 : // System.out.println("ShiftExpression ::= ShiftExpression LEFT_SHIFT AdditiveExpression");
-                           consumeBinaryExpression(OperatorExpression.LEFT_SHIFT);  
-                               break ;
-        
-           case 351 : // System.out.println("ShiftExpression ::= ShiftExpression RIGHT_SHIFT AdditiveExpression");
-                           consumeBinaryExpression(OperatorExpression.RIGHT_SHIFT);  
-                               break ;
-        
-           case 352 : // System.out.println("ShiftExpression ::= ShiftExpression UNSIGNED_RIGHT_SHIFT AdditiveExpression");
-                           consumeBinaryExpression(OperatorExpression.UNSIGNED_RIGHT_SHIFT);  
-                               break ;
-        
-           case 354 : // System.out.println("RelationalExpression ::= RelationalExpression LESS ShiftExpression");
-                           consumeBinaryExpression(OperatorExpression.LESS);  
-                               break ;
-        
-           case 355 : // System.out.println("RelationalExpression ::= RelationalExpression GREATER ShiftExpression");
-                           consumeBinaryExpression(OperatorExpression.GREATER);  
-                               break ;
-        
-           case 356 : // System.out.println("RelationalExpression ::= RelationalExpression LESS_EQUAL ShiftExpression");
-                           consumeBinaryExpression(OperatorExpression.LESS_EQUAL);  
-                               break ;
-        
-           case 357 : // System.out.println("RelationalExpression ::= RelationalExpression GREATER_EQUAL ShiftExpression");
-                           consumeBinaryExpression(OperatorExpression.GREATER_EQUAL);  
-                               break ;
-        
-           case 358 : // System.out.println("RelationalExpression ::= RelationalExpression instanceof ReferenceType");
-                           consumeInstanceOfExpression(OperatorExpression.INSTANCEOF);  
-                               break ;
-        
-           case 360 : // System.out.println("EqualityExpression ::= EqualityExpression EQUAL_EQUAL RelationalExpression");
-                           consumeEqualityExpression(OperatorExpression.EQUAL_EQUAL);  
-                               break ;
-        
-           case 361 : // System.out.println("EqualityExpression ::= EqualityExpression NOT_EQUAL RelationalExpression");
-                           consumeEqualityExpression(OperatorExpression.NOT_EQUAL);  
-                               break ;
-        
-           case 363 : // System.out.println("AndExpression ::= AndExpression AND EqualityExpression");
-                           consumeBinaryExpression(OperatorExpression.AND);  
-                               break ;
-        
-           case 365 : // System.out.println("ExclusiveOrExpression ::= ExclusiveOrExpression XOR AndExpression");
-                           consumeBinaryExpression(OperatorExpression.XOR);  
-                               break ;
-        
-           case 367 : // System.out.println("InclusiveOrExpression ::= InclusiveOrExpression OR ExclusiveOrExpression");
-                           consumeBinaryExpression(OperatorExpression.OR);  
-                               break ;
-        
-           case 369 : // System.out.println("ConditionalAndExpression ::= ConditionalAndExpression AND_AND InclusiveOrExpression");
-                           consumeBinaryExpression(OperatorExpression.AND_AND);  
-                               break ;
-        
-           case 371 : // System.out.println("ConditionalOrExpression ::= ConditionalOrExpression OR_OR ConditionalAndExpression");
-                           consumeBinaryExpression(OperatorExpression.OR_OR);  
-                               break ;
-        
-           case 373 : // System.out.println("ConditionalExpression ::= ConditionalOrExpression QUESTION Expression COLON...");
-                           consumeConditionalExpression(OperatorExpression.QUESTIONCOLON) ;  
-                               break ;
-        
-           case 376 : // System.out.println("Assignment ::= LeftHandSide AssignmentOperator AssignmentExpression");
-                           consumeAssignment();  
-                               break ;
-        
-           case 378 : // System.out.println("Assignment ::= InvalidArrayInitializerAssignement");
-                           ignoreExpressionAssignment(); 
-                               break ;
-        
-           case 379 : // System.out.println("LeftHandSide ::= Name");
-                           consumeLeftHandSide();  
-                               break ;
-        
-           case 382 : // System.out.println("AssignmentOperator ::= EQUAL");
-                           consumeAssignmentOperator(EQUAL);  
-                               break ;
-        
-           case 383 : // System.out.println("AssignmentOperator ::= MULTIPLY_EQUAL");
-                           consumeAssignmentOperator(MULTIPLY);  
-                               break ;
-        
-           case 384 : // System.out.println("AssignmentOperator ::= DIVIDE_EQUAL");
-                           consumeAssignmentOperator(DIVIDE);  
-                               break ;
-        
-           case 385 : // System.out.println("AssignmentOperator ::= REMAINDER_EQUAL");
-                           consumeAssignmentOperator(REMAINDER);  
-                               break ;
-        
-           case 386 : // System.out.println("AssignmentOperator ::= PLUS_EQUAL");
-                           consumeAssignmentOperator(PLUS);  
-                               break ;
-        
-           case 387 : // System.out.println("AssignmentOperator ::= MINUS_EQUAL");
-                           consumeAssignmentOperator(MINUS);  
-                               break ;
-        
-           case 388 : // System.out.println("AssignmentOperator ::= LEFT_SHIFT_EQUAL");
-                           consumeAssignmentOperator(LEFT_SHIFT);  
-                               break ;
-        
-           case 389 : // System.out.println("AssignmentOperator ::= RIGHT_SHIFT_EQUAL");
-                           consumeAssignmentOperator(RIGHT_SHIFT);  
-                               break ;
-        
-           case 390 : // System.out.println("AssignmentOperator ::= UNSIGNED_RIGHT_SHIFT_EQUAL");
-                           consumeAssignmentOperator(UNSIGNED_RIGHT_SHIFT);  
-                               break ;
-        
-           case 391 : // System.out.println("AssignmentOperator ::= AND_EQUAL");
-                           consumeAssignmentOperator(AND);  
-                               break ;
-        
-           case 392 : // System.out.println("AssignmentOperator ::= XOR_EQUAL");
-                           consumeAssignmentOperator(XOR);  
-                               break ;
-        
-           case 393 : // System.out.println("AssignmentOperator ::= OR_EQUAL");
-                           consumeAssignmentOperator(OR);  
-                               break ;
-        
-           case 400 : // System.out.println("Expressionopt ::=");
-                           consumeEmptyExpression();  
-                               break ;
-        
-           case 404 : // System.out.println("ImportDeclarationsopt ::=");
-                           consumeEmptyImportDeclarationsopt();  
-                               break ;
-        
-           case 405 : // System.out.println("ImportDeclarationsopt ::= ImportDeclarations");
-                           consumeImportDeclarationsopt();  
-                               break ;
-        
-           case 406 : // System.out.println("TypeDeclarationsopt ::=");
-                           consumeEmptyTypeDeclarationsopt();  
-                               break ;
-        
-           case 407 : // System.out.println("TypeDeclarationsopt ::= TypeDeclarations");
-                           consumeTypeDeclarationsopt();  
-                               break ;
-        
-           case 408 : // System.out.println("ClassBodyDeclarationsopt ::=");
-                           consumeEmptyClassBodyDeclarationsopt();  
-                               break ;
-        
-           case 409 : // System.out.println("ClassBodyDeclarationsopt ::= NestedType ClassBodyDeclarations");
-                           consumeClassBodyDeclarationsopt();  
-                               break ;
-        
-            case 410 : // System.out.println("Modifiersopt ::=");
-                           consumeDefaultModifiers();  
-                               break ;
-        
-           case 411 : // System.out.println("Modifiersopt ::= Modifiers");
-                           consumeModifiers();  
-                               break ;
-        
-           case 412 : // System.out.println("BlockStatementsopt ::=");
-                           consumeEmptyBlockStatementsopt();  
-                               break ;
-        
-            case 414 : // System.out.println("Dimsopt ::=");
-                           consumeEmptyDimsopt();  
-                               break ;
-        
-            case 416 : // System.out.println("ArgumentListopt ::=");
-                           consumeEmptyArgumentListopt();  
-                               break ;
-        
-           case 420 : // System.out.println("FormalParameterListopt ::=");
-                           consumeFormalParameterListopt();  
-                               break ;
-        
-            case 424 : // System.out.println("InterfaceMemberDeclarationsopt ::=");
-                           consumeEmptyInterfaceMemberDeclarationsopt();  
-                               break ;
-        
-            case 425 : // System.out.println("InterfaceMemberDeclarationsopt ::= NestedType InterfaceMemberDeclarations");
-                           consumeInterfaceMemberDeclarationsopt();  
-                               break ;
-        
-           case 426 : // System.out.println("NestedType ::=");
-                           consumeNestedType();  
-                               break ;
-       
-            case 427 : // System.out.println("ForInitopt ::=");
-                           consumeEmptyForInitopt();  
-                               break ;
-        
-            case 429 : // System.out.println("ForUpdateopt ::=");
-                           consumeEmptyForUpdateopt();  
-                               break ;
-        
-            case 433 : // System.out.println("Catchesopt ::=");
-                           consumeEmptyCatchesopt();  
-                               break ;
-        
-            case 435 : // System.out.println("ArrayInitializeropt ::=");
-                           consumeEmptyArrayInitializeropt();  
-                               break ;
-        
-               }
-       } 
-
-       
-protected void consumeSimpleAssertStatement() {
-       // AssertStatement ::= 'assert' Expression ';'
-       expressionLengthPtr--;
-       pushOnAstStack(new AssertStatement(expressionStack[expressionPtr--], intStack[intPtr--]));      
-}
-       
-protected void consumeSingleTypeImportDeclaration() {
-       // SingleTypeImportDeclaration ::= SingleTypeImportDeclarationName ';'
-
-       ImportReference impt = (ImportReference) astStack[astPtr];
-       // flush annotations defined prior to import statements
-       impt.declarationEnd = endStatementPosition;
-       impt.declarationSourceEnd = 
-               this.flushAnnotationsDefinedPriorTo(impt.declarationSourceEnd); 
-
-       // recovery
-       if (currentElement != null) {
-               lastCheckPoint = impt.declarationSourceEnd + 1;
-               currentElement = currentElement.add(impt, 0);
-               lastIgnoredToken = -1;
-               restartRecovery = true; 
-               // used to avoid branching back into the regular automaton
-       }
-}
-protected void consumeSingleTypeImportDeclarationName() {
-       // SingleTypeImportDeclarationName ::= 'import' Name
-       /* push an ImportRef build from the last name 
-       stored in the identifier stack. */
-
-       ImportReference impt;
-       int length;
-       char[][] tokens = new char[length = identifierLengthStack[identifierLengthPtr--]][];
-       identifierPtr -= length;
-       long[] positions = new long[length];
-       System.arraycopy(identifierStack, identifierPtr + 1, tokens, 0, length);
-       System.arraycopy(identifierPositionStack, identifierPtr + 1, positions, 0, length);
-       pushOnAstStack(impt = new ImportReference(tokens, positions, false));
-
-       if (currentToken == TokenNameSEMICOLON){
-               impt.declarationSourceEnd = scanner.currentPosition - 1;
-       } else {
-               impt.declarationSourceEnd = impt.sourceEnd;
-       }
-       impt.declarationEnd = impt.declarationSourceEnd;
-       //endPosition is just before the ;
-       impt.declarationSourceStart = intStack[intPtr--];
-
-       // recovery
-       if (currentElement != null){
-               lastCheckPoint = impt.declarationSourceEnd+1;
-               currentElement = currentElement.add(impt, 0);
-               lastIgnoredToken = -1;
-               restartRecovery = true; // used to avoid branching back into the regular automaton              
-       }
-}
-protected void consumeStatementBreak() {
-       // BreakStatement ::= 'break' ';'
-       // break pushs a position on intStack in case there is no label
+      case 150 : // System.out.println("ClassTypeElt ::= ClassType");
+        consumeClassTypeElt();
+        break;
 
-       pushOnAstStack(new Break(null, intStack[intPtr--], endPosition));
-}
-protected void consumeStatementBreakWithLabel() {
-       // BreakStatement ::= 'break' Identifier ';'
-       // break pushs a position on intStack in case there is no label
-
-       pushOnAstStack(
-               new Break(
-                       identifierStack[identifierPtr--],
-                       intStack[intPtr--],
-                       endPosition)); 
-       identifierLengthPtr--;
-}
-protected void consumeStatementCatch() {
-       // CatchClause ::= 'catch' '(' FormalParameter ')'    Block
+      case 151 : // System.out.println("MethodBody ::= NestedMethod LBRACE BlockStatementsopt RBRACE");
+        consumeMethodBody();
+        break;
 
-       //catch are stored directly into the Try
-       //has they always comes two by two....
-       //we remove one entry from the astlengthPtr.
-       //The construction of the try statement must
-       //then fetch the catches using  2*i and 2*i + 1
+      case 152 : // System.out.println("NestedMethod ::=");
+        consumeNestedMethod();
+        break;
 
-       astLengthPtr--;
-       listLength = 0; // reset formalParameter counter (incremented for catch variable)
-}
-protected void consumeStatementContinue() {
-       // ContinueStatement ::= 'continue' ';'
-       // continue pushs a position on intStack in case there is no label
-
-       pushOnAstStack(
-               new Continue(
-                       null,
-                       intStack[intPtr--],
-                       endPosition));
-}
-protected void consumeStatementContinueWithLabel() {
-       // ContinueStatement ::= 'continue' Identifier ';'
-       // continue pushs a position on intStack in case there is no label
-
-       pushOnAstStack(
-               new Continue(
-                       identifierStack[identifierPtr--], 
-                       intStack[intPtr--], 
-                       endPosition)); 
-       identifierLengthPtr--;
-}
-protected void consumeStatementDo() {
-       // DoStatement ::= 'do' Statement 'while' '(' Expression ')' ';'
-
-       //the 'while' pushes a value on intStack that we need to remove
-       intPtr--;
-
-       //optimize the push/pop
-       Statement action = (Statement) astStack[astPtr];
-       if (action instanceof EmptyStatement
-               && problemReporter.options.complianceLevel <= CompilerOptions.JDK1_3) {
-               expressionLengthPtr--;
-               astStack[astPtr] = 
-                       new DoStatement(
-                               expressionStack[expressionPtr--], 
-                               null, 
-                               intStack[intPtr--], 
-                               endPosition); 
-       } else {
-               expressionLengthPtr--;
-               astStack[astPtr] = 
-                       new DoStatement(
-                               expressionStack[expressionPtr--], 
-                               action, 
-                               intStack[intPtr--], 
-                               endPosition); 
-       }
-}
-protected void consumeStatementExpressionList() {
-       // StatementExpressionList ::= StatementExpressionList ',' StatementExpression
-       concatExpressionLists();
-}
-protected void consumeStatementFor() {
-       // ForStatement ::= 'for' '(' ForInitopt ';' Expressionopt ';' ForUpdateopt ')' Statement
-       // ForStatementNoShortIf ::= 'for' '(' ForInitopt ';' Expressionopt ';' ForUpdateopt ')' StatementNoShortIf
-
-       int length;
-       Expression cond = null;
-       Statement[] inits, updates;
-       Statement action;
-       boolean scope = true;
-
-       //statements
-       astLengthPtr--; // we need to consume it
-       action = (Statement) astStack[astPtr--];
-       if (action instanceof EmptyStatement
-               && problemReporter.options.complianceLevel <= CompilerOptions.JDK1_3) {
-               action = null;
-       }
-
-       //updates are on the expresion stack
-       if ((length = expressionLengthStack[expressionLengthPtr--]) == 0) {
-               updates = null;
-       } else {
-               expressionPtr -= length;
-               System.arraycopy(
-                       expressionStack, 
-                       expressionPtr + 1, 
-                       updates = new Statement[length], 
-                       0, 
-                       length); 
-       }
-
-       if (expressionLengthStack[expressionLengthPtr--] != 0)
-               cond = expressionStack[expressionPtr--];
-
-       //inits may be on two different stacks
-       if ((length = astLengthStack[astLengthPtr--]) == 0) {
-               inits = null;
-               scope = false;
-       } else {
-               if (length == -1) { //on expressionStack
-                       scope = false;
-                       length = expressionLengthStack[expressionLengthPtr--];
-                       expressionPtr -= length;
-                       System.arraycopy(
-                               expressionStack, 
-                               expressionPtr + 1, 
-                               inits = new Statement[length], 
-                               0, 
-                               length); 
-               } else { //on astStack
-                       astPtr -= length;
-                       System.arraycopy(
-                               astStack, 
-                               astPtr + 1, 
-                               inits = new Statement[length], 
-                               0, 
-                               length); 
-               }
-       };
-       if (action instanceof Block) {
-               pushOnAstStack(
-                       new ForStatement(
-                               inits, 
-                               cond, 
-                               updates, 
-                               action, 
-                               scope, 
-                               intStack[intPtr--], 
-                               endStatementPosition)); 
-       } else {
-               pushOnAstStack(
-                       new ForStatement(
-                               inits, 
-                               cond, 
-                               updates, 
-                               action, 
-                               scope, 
-                               intStack[intPtr--], 
-                               endPosition)); 
-       }
-}
-protected void consumeStatementIfNoElse() {
-       // IfThenStatement ::=  'if' '(' Expression ')' Statement
-
-       //optimize the push/pop
-       expressionLengthPtr--;
-       Statement thenStatement = (Statement) astStack[astPtr];
-       if (thenStatement instanceof Block) {
-               astStack[astPtr] = 
-                       new IfStatement(
-                               expressionStack[expressionPtr--], 
-                               thenStatement, 
-                               intStack[intPtr--], 
-                               endStatementPosition); 
-       } else if (thenStatement instanceof EmptyStatement) {
-               astStack[astPtr] = 
-                       new IfStatement(
-                               expressionStack[expressionPtr--], 
-                               Block.None, 
-                               intStack[intPtr--], 
-                               endStatementPosition); 
-       } else {
-               astStack[astPtr] = 
-                       new IfStatement(
-                               expressionStack[expressionPtr--], 
-                               thenStatement, 
-                               intStack[intPtr--], 
-                               endStatementPosition); 
-       }
-}
-protected void consumeStatementIfWithElse() {
-       // IfThenElseStatement ::=  'if' '(' Expression ')' StatementNoShortIf 'else' Statement
-       // IfThenElseStatementNoShortIf ::=  'if' '(' Expression ')' StatementNoShortIf 'else' StatementNoShortIf
-
-       astLengthPtr--; // optimized {..., Then, Else } ==> {..., If }
-       expressionLengthPtr--;
-       //optimize the push/pop
-       Statement elseStatement = (Statement) astStack[astPtr--];
-       Statement thenStatement = (Statement) astStack[astPtr];
-       if (elseStatement instanceof EmptyStatement) {
-               elseStatement = Block.None;
-       }
-       if (thenStatement instanceof EmptyStatement) {
-               thenStatement = Block.None;
-       }
-       if (elseStatement instanceof Block) {
-               astStack[astPtr] = 
-                       new IfStatement(
-                               expressionStack[expressionPtr--], 
-                               thenStatement, 
-                               elseStatement, 
-                               intStack[intPtr--], 
-                               endStatementPosition); 
-       } else {
-               astStack[astPtr] = 
-                       new IfStatement(
-                               expressionStack[expressionPtr--], 
-                               thenStatement, 
-                               elseStatement, 
-                               intStack[intPtr--], 
-                               endStatementPosition); 
-       }
-}
-protected void consumeStatementLabel() {
-       // LabeledStatement ::= 'Identifier' ':' Statement
-       // LabeledStatementNoShortIf ::= 'Identifier' ':' StatementNoShortIf
-
-       //optimize push/pop
-
-       Statement stmt = (Statement) astStack[astPtr];
-       if (stmt instanceof EmptyStatement) {
-               astStack[astPtr] = 
-                       new LabeledStatement(
-                               identifierStack[identifierPtr], 
-                               Block.None, 
-                               (int) (identifierPositionStack[identifierPtr--] >>> 32), 
-                               endStatementPosition); 
-       } else {
-               astStack[astPtr] = 
-                       new LabeledStatement(
-                               identifierStack[identifierPtr], 
-                               stmt, 
-                               (int) (identifierPositionStack[identifierPtr--] >>> 32), 
-                               endStatementPosition); 
-       }
-       identifierLengthPtr--;
-}
-protected void consumeStatementReturn() {
-       // ReturnStatement ::= 'return' Expressionopt ';'
-       // return pushs a position on intStack in case there is no expression
-
-       if (expressionLengthStack[expressionLengthPtr--] != 0) {
-               pushOnAstStack(
-                       new ReturnStatement(
-                               expressionStack[expressionPtr--], 
-                               intStack[intPtr--], 
-                               endPosition)
-               );
-       } else {
-               pushOnAstStack(new ReturnStatement(null, intStack[intPtr--], endPosition));
-       }
-}
-protected void consumeStatementSwitch() {
-       // SwitchStatement ::= 'switch' OpenBlock '(' Expression ')' SwitchBlock
-
-       //OpenBlock just makes the semantic action blockStart()
-       //the block is inlined but a scope need to be created
-       //if some declaration occurs.
-
-       int length;
-       SwitchStatement s = new SwitchStatement();
-       expressionLengthPtr--;
-       s.testExpression = expressionStack[expressionPtr--];
-       if ((length = astLengthStack[astLengthPtr--]) != 0) {
-               astPtr -= length;
-               System.arraycopy(
-                       astStack, 
-                       astPtr + 1, 
-                       s.statements = new Statement[length], 
-                       0, 
-                       length); 
-       }
-       s.explicitDeclarations = realBlockStack[realBlockPtr--];
-       pushOnAstStack(s);
-       intPtr--; // because of OpenBlock
-       s.sourceStart = intStack[intPtr--];
-       s.sourceEnd = endStatementPosition;
-}
-protected void consumeStatementSynchronized() {
-       // SynchronizedStatement ::= OnlySynchronized '(' Expression ')' Block
-       //optimize the push/pop
-
-       if (astLengthStack[astLengthPtr] == 0) {
-               astLengthStack[astLengthPtr] = 1;
-               expressionLengthPtr--;
-               astStack[++astPtr] = 
-                       new SynchronizedStatement(
-                               expressionStack[expressionPtr--], 
-                               Block.None, 
-                               intStack[intPtr--], 
-                               endStatementPosition); 
-       } else {
-               expressionLengthPtr--;
-               astStack[astPtr] = 
-                       new SynchronizedStatement(
-                               expressionStack[expressionPtr--], 
-                               (Block) astStack[astPtr], 
-                               intStack[intPtr--], 
-                               endStatementPosition); 
-       }
-       resetModifiers();
-}
-protected void consumeStatementThrow() {
-       // ThrowStatement ::= 'throw' Expression ';'
-       expressionLengthPtr--;
-       pushOnAstStack(new ThrowStatement(expressionStack[expressionPtr--], intStack[intPtr--]));
-}
-protected void consumeStatementTry(boolean withFinally) {
-       //TryStatement ::= 'try'  Block Catches
-       //TryStatement ::= 'try'  Block Catchesopt Finally
-
-       int length;
-       TryStatement tryStmt = new TryStatement();
-       //finally
-       if (withFinally) {
-               astLengthPtr--;
-               tryStmt.finallyBlock = (Block) astStack[astPtr--];
-       }
-       //catches are handle by two <argument-block> [see statementCatch]
-       if ((length = astLengthStack[astLengthPtr--]) != 0) {
-               if (length == 1) {
-                       tryStmt.catchBlocks = new Block[] {(Block) astStack[astPtr--]};
-                       tryStmt.catchArguments = new Argument[] {(Argument) astStack[astPtr--]};
-               } else {
-                       Block[] bks = (tryStmt.catchBlocks = new Block[length]);
-                       Argument[] args = (tryStmt.catchArguments = new Argument[length]);
-                       while (length-- > 0) {
-                               bks[length] = (Block) astStack[astPtr--];
-                               args[length] = (Argument) astStack[astPtr--];
-                       }
-               }
-       }
-       //try
-       astLengthPtr--;
-       tryStmt.tryBlock = (Block) astStack[astPtr--];
-
-       //positions
-       tryStmt.sourceEnd = endStatementPosition;
-       tryStmt.sourceStart = intStack[intPtr--];
-       pushOnAstStack(tryStmt);
-}
-protected void consumeStatementWhile() {
-       // WhileStatement ::= 'while' '(' Expression ')' Statement
-       // WhileStatementNoShortIf ::= 'while' '(' Expression ')' StatementNoShortIf
-
-       Statement action = (Statement) astStack[astPtr];
-       expressionLengthPtr--;
-       if (action instanceof Block) {
-               astStack[astPtr] = 
-                       new WhileStatement(
-                               expressionStack[expressionPtr--], 
-                               action, 
-                               intStack[intPtr--], 
-                               endStatementPosition); 
-       } else {
-               if (action instanceof EmptyStatement
-                       && problemReporter.options.complianceLevel <= CompilerOptions.JDK1_3) {
-                       astStack[astPtr] = 
-                               new WhileStatement(
-                                       expressionStack[expressionPtr--], 
-                                       null, 
-                                       intStack[intPtr--], 
-                                       endPosition); 
-               } else {
-                       astStack[astPtr] = 
-                               new WhileStatement(
-                                       expressionStack[expressionPtr--], 
-                                       action, 
-                                       intStack[intPtr--], 
-                                       endPosition); 
-               }
-       }
-}
-protected void consumeStaticInitializer() {
-       // StaticInitializer ::=  StaticOnly Block
-       //push an Initializer
-       //optimize the push/pop
-       Initializer initializer = new Initializer((Block) astStack[astPtr], AccStatic);
-       astStack[astPtr] = initializer;
-       initializer.sourceEnd = endStatementPosition;   
-       initializer.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition);
-       nestedMethod[nestedType] --;
-       initializer.declarationSourceStart = intStack[intPtr--];
-       
-       // recovery
-       if (currentElement != null){
-               lastCheckPoint = initializer.declarationSourceEnd;
-               currentElement = currentElement.add(initializer, 0);
-               lastIgnoredToken = -1;
-       }
-}
-protected void consumeStaticOnly() {
-       // StaticOnly ::= 'static'
-       int savedModifiersSourceStart = modifiersSourceStart;
-       checkAnnotation(); // might update declaration source start
-       if (modifiersSourceStart >= savedModifiersSourceStart) {
-               modifiersSourceStart = savedModifiersSourceStart;
-       }
-       pushOnIntStack(
-               modifiersSourceStart >= 0 ? modifiersSourceStart : scanner.startPosition);
-       jumpOverMethodBody();
-       nestedMethod[nestedType]++;
-       resetModifiers();
-
-       // recovery
-       if (currentElement != null){
-               recoveredStaticInitializerStart = intStack[intPtr]; // remember start position only for static initializers
-       }
-}
-protected void consumeSwitchBlock() {
-       // SwitchBlock ::= '{' SwitchBlockStatements SwitchLabels '}'
-       concatNodeLists();
-}
-protected void consumeSwitchBlockStatement() {
-       // SwitchBlockStatement ::= SwitchLabels BlockStatements
-       concatNodeLists();
-}
-protected void consumeSwitchBlockStatements() {
-       // SwitchBlockStatements ::= SwitchBlockStatements SwitchBlockStatement
-       concatNodeLists();
-}
-protected void consumeSwitchLabels() {
-       // SwitchLabels ::= SwitchLabels SwitchLabel
-       optimizedConcatNodeLists();
-}
-protected void consumeToken(int type) {
-       /* remember the last consumed value */
-       /* try to minimize the number of build values */
-       if (scanner.wasNonExternalizedStringLiteral) {
-               StringLiteral[] literals = this.scanner.nonNLSStrings;
-               // could not reproduce, but this is the only NPE
-               // added preventive null check see PR 9035
-               if (literals != null) {
-                       for (int i = 0, max = literals.length; i < max; i++) {
-                               problemReporter().nonExternalizedStringLiteral(literals[i]);
-                       }
-               }
-               scanner.currentLine = null;
-               scanner.wasNonExternalizedStringLiteral = false;
-       }
-       // clear the commentPtr of the scanner in case we read something different from a modifier
-       switch(type) {
-//             case TokenNameabstract :
-//             case TokenNamestrictfp :
-//             case TokenNamefinal :
-//             case TokenNamenative :
-//             case TokenNameprivate :
-//             case TokenNameprotected :
-//             case TokenNamepublic :
-//             case TokenNametransient :
-//             case TokenNamevolatile :
-               case TokenNamestatic :
-//             case TokenNamesynchronized :
-                       break;
-               default:
-                       scanner.commentPtr = -1;
-       }
-       //System.out.println(scanner.toStringAction(type));
-       switch (type) {
-               case TokenNameIdentifier :
-                       pushIdentifier();
-                       if (scanner.useAssertAsAnIndentifier) {
-                               long positions = identifierPositionStack[identifierPtr];
-                               problemReporter().useAssertAsAnIdentifier((int) (positions >>> 32), (int) positions);
-                       }
-                       scanner.commentPtr = -1;
-                       break;
-//             case TokenNameinterface :
-//                     adjustInterfaceModifiers();
-//                     //'class' is pushing two int (positions) on the stack ==> 'interface' needs to do it too....
-//                     pushOnIntStack(scanner.startPosition);
-//                     pushOnIntStack(scanner.currentPosition - 1);                    
-//                     scanner.commentPtr = -1;
-//                     break;
-//             case TokenNameabstract :
-//                     checkAndSetModifiers(AccAbstract);
-//                     break;
-//             case TokenNamestrictfp :
-//                     checkAndSetModifiers(AccStrictfp);
-//                     break;
-//             case TokenNamefinal :
-//                     checkAndSetModifiers(AccFinal);
-//                     break;
-//             case TokenNamenative :
-//                     checkAndSetModifiers(AccNative);
-//                     break;
-//             case TokenNameprivate :
-//                     checkAndSetModifiers(AccPrivate);
-//                     break;
-//             case TokenNameprotected :
-//                     checkAndSetModifiers(AccProtected);
-//                     break;
-//             case TokenNamepublic :
-//                     checkAndSetModifiers(AccPublic);
-//                     break;
-//             case TokenNametransient :
-//                     checkAndSetModifiers(AccTransient);
-//                     break;
-//             case TokenNamevolatile :
-//                     checkAndSetModifiers(AccVolatile);
-//                     break;
-               case TokenNamestatic :
-                       checkAndSetModifiers(AccStatic);
-                       break;
-//             case TokenNamesynchronized :
-//                     this.synchronizedBlockSourceStart = scanner.startPosition;      
-//                     checkAndSetModifiers(AccSynchronized);
-//                     break;
-//                     //==============================
-//             case TokenNamevoid :
-//                     pushIdentifier(-T_void);
-//                     pushOnIntStack(scanner.currentPosition - 1);                            
-//                     pushOnIntStack(scanner.startPosition);
-//                     scanner.commentPtr = -1;
-//                     break;
-//                     //push a default dimension while void is not part of the primitive
-//                     //declaration baseType and so takes the place of a type without getting into
-//                     //regular type parsing that generates a dimension on intStack
-//             case TokenNameboolean :
-//                     pushIdentifier(-T_boolean);
-//                     pushOnIntStack(scanner.currentPosition - 1);                            
-//                     pushOnIntStack(scanner.startPosition);          
-//                     scanner.commentPtr = -1;
-//                     break;
-//             case TokenNamebyte :
-//                     pushIdentifier(-T_byte);
-//                     pushOnIntStack(scanner.currentPosition - 1);                            
-//                     pushOnIntStack(scanner.startPosition);                                  
-//                     scanner.commentPtr = -1;
-//                     break;
-//             case TokenNamechar :
-//                     pushIdentifier(-T_char);
-//                     pushOnIntStack(scanner.currentPosition - 1);                            
-//                     pushOnIntStack(scanner.startPosition);                                  
-//                     scanner.commentPtr = -1;
-//                     break;
-//             case TokenNamedouble :
-//                     pushIdentifier(-T_double);
-//                     pushOnIntStack(scanner.currentPosition - 1);                            
-//                     pushOnIntStack(scanner.startPosition);                                  
-//                     scanner.commentPtr = -1;
-//                     break;
-//             case TokenNamefloat :
-//                     pushIdentifier(-T_float);
-//                     pushOnIntStack(scanner.currentPosition - 1);                            
-//                     pushOnIntStack(scanner.startPosition);                                  
-//                     scanner.commentPtr = -1;
-//                     break;
-//             case TokenNameint :
-//                     pushIdentifier(-T_int);
-//                     pushOnIntStack(scanner.currentPosition - 1);                            
-//                     pushOnIntStack(scanner.startPosition);                                  
-//                     scanner.commentPtr = -1;
-//                     break;
-//             case TokenNamelong :
-//                     pushIdentifier(-T_long);
-//                     pushOnIntStack(scanner.currentPosition - 1);                            
-//                     pushOnIntStack(scanner.startPosition);                                  
-//                     scanner.commentPtr = -1;
-//                     break;
-//             case TokenNameshort :
-//                     pushIdentifier(-T_short);
-//                     pushOnIntStack(scanner.currentPosition - 1);                            
-//                     pushOnIntStack(scanner.startPosition);                                  
-//                     scanner.commentPtr = -1;
-//                     break;
-                       //==============================
-               case TokenNameIntegerLiteral :
-                       pushOnExpressionStack(
-                               new IntLiteral(
-                                       scanner.getCurrentTokenSource(), 
-                                       scanner.startPosition, 
-                                       scanner.currentPosition - 1)); 
-                       scanner.commentPtr = -1;
-                       break;
-               case TokenNameLongLiteral :
-                       pushOnExpressionStack(
-                               new LongLiteral(
-                                       scanner.getCurrentTokenSource(), 
-                                       scanner.startPosition, 
-                                       scanner.currentPosition - 1)); 
-                       scanner.commentPtr = -1;
-                       break;
-               case TokenNameFloatingPointLiteral :
-                       pushOnExpressionStack(
-                               new FloatLiteral(
-                                       scanner.getCurrentTokenSource(), 
-                                       scanner.startPosition, 
-                                       scanner.currentPosition - 1)); 
-                       scanner.commentPtr = -1;
-                       break;
-               case TokenNameDoubleLiteral :
-                       pushOnExpressionStack(
-                               new DoubleLiteral(
-                                       scanner.getCurrentTokenSource(), 
-                                       scanner.startPosition, 
-                                       scanner.currentPosition - 1)); 
-                       scanner.commentPtr = -1;
-                       break;
-               case TokenNameCharacterLiteral :
-                       pushOnExpressionStack(
-                               new CharLiteral(
-                                       scanner.getCurrentTokenSource(), 
-                                       scanner.startPosition, 
-                                       scanner.currentPosition - 1)); 
-                       scanner.commentPtr = -1;
-                       break;
-               case TokenNameStringLiteral :
-                       StringLiteral stringLiteral = new StringLiteral(
-                                       scanner.getCurrentTokenSourceString(), 
-                                       scanner.startPosition, 
-                                       scanner.currentPosition - 1); 
-                       pushOnExpressionStack(stringLiteral); 
-                       scanner.commentPtr = -1;
-                       break;
-               case TokenNamefalse :
-                       pushOnExpressionStack(
-                               new FalseLiteral(scanner.startPosition, scanner.currentPosition - 1)); 
-                       scanner.commentPtr = -1;
-                       break;
-               case TokenNametrue :
-                       pushOnExpressionStack(
-                               new TrueLiteral(scanner.startPosition, scanner.currentPosition - 1)); 
-                       break;
-               case TokenNamenull :
-                       pushOnExpressionStack(
-                               new NullLiteral(scanner.startPosition, scanner.currentPosition - 1)); 
-                       break;
-                       //============================
-//             case TokenNamesuper :
-//             case TokenNamethis :
-//                     endPosition = scanner.currentPosition - 1;
-//                     pushOnIntStack(scanner.startPosition);
-//                     break;
-//             case TokenNameassert :
-//             case TokenNameimport :
-//             case TokenNamepackage :
-//             case TokenNamethrow :
-               case TokenNamenew :
-               case TokenNamedo :
-               case TokenNameif :
-               case TokenNamefor :
-               case TokenNameswitch :
-//             case TokenNametry :
-               case TokenNamewhile :
-               case TokenNamebreak :
-               case TokenNamecontinue :
-               case TokenNamereturn :
-               case TokenNamecase :
-                       pushOnIntStack(scanner.startPosition);
-                       break;
-               case TokenNameclass :
-                       pushOnIntStack(scanner.currentPosition - 1);
-                       pushOnIntStack(scanner.startPosition);
-                       break;
-               case TokenNamedefault :
-                       pushOnIntStack(scanner.startPosition);
-                       pushOnIntStack(scanner.currentPosition - 1);
-                       break;
-                       //let extra semantic action decide when to push
-               case TokenNameRBRACKET :
-               case TokenNamePLUS :
-               case TokenNameMINUS :
-               case TokenNameNOT :
-               case TokenNameTWIDDLE :
-                       endPosition = scanner.startPosition;
-                       break;
-               case TokenNamePLUS_PLUS :
-               case TokenNameMINUS_MINUS :
-                       endPosition = scanner.startPosition;
-                       endStatementPosition = scanner.currentPosition - 1;
-                       break;
-               case TokenNameRBRACE:
-               case TokenNameSEMICOLON :
-                       endStatementPosition = scanner.currentPosition - 1;
-                       endPosition = scanner.startPosition - 1; 
-                       //the item is not part of the potential futur expression/statement
-                       break;
-                       // in order to handle ( expression) ////// (cast)expression///// foo(x)
-               case TokenNameRPAREN :
-                       rParenPos = scanner.currentPosition - 1; // position of the end of right parenthesis (in case of unicode \u0029) lex00101
-                       break;
-               case TokenNameLPAREN :
-                       lParenPos = scanner.startPosition;
-                       break;
-                       //  case TokenNameQUESTION  :
-                       //  case TokenNameCOMMA :
-                       //  case TokenNameCOLON  :
-                       //  case TokenNameEQUAL  :
-                       //  case TokenNameLBRACKET  :
-                       //  case TokenNameDOT :
-                       //  case TokenNameERROR :
-                       //  case TokenNameEOF  :
-                       //  case TokenNamecase  :
-                       //  case TokenNamecatch  :
-                       //  case TokenNameelse  :
-                       //  case TokenNameextends  :
-                       //  case TokenNamefinally  :
-                       //  case TokenNameimplements  :
-                       //  case TokenNamethrows  :
-                       //  case TokenNameinstanceof  :
-                       //  case TokenNameEQUAL_EQUAL  :
-                       //  case TokenNameLESS_EQUAL  :
-                       //  case TokenNameGREATER_EQUAL  :
-                       //  case TokenNameNOT_EQUAL  :
-                       //  case TokenNameLEFT_SHIFT  :
-                       //  case TokenNameRIGHT_SHIFT  :
-                       //  case TokenNameUNSIGNED_RIGHT_SHIFT :
-                       //  case TokenNamePLUS_EQUAL  :
-                       //  case TokenNameMINUS_EQUAL  :
-                       //  case TokenNameMULTIPLY_EQUAL  :
-                       //  case TokenNameDIVIDE_EQUAL  :
-                       //  case TokenNameAND_EQUAL  :
-                       //  case TokenNameOR_EQUAL  :
-                       //  case TokenNameXOR_EQUAL  :
-                       //  case TokenNameREMAINDER_EQUAL  :
-                       //  case TokenNameLEFT_SHIFT_EQUAL  :
-                       //  case TokenNameRIGHT_SHIFT_EQUAL  :
-                       //  case TokenNameUNSIGNED_RIGHT_SHIFT_EQUAL  :
-                       //  case TokenNameOR_OR  :
-                       //  case TokenNameAND_AND  :
-                       //  case TokenNameREMAINDER :
-                       //  case TokenNameXOR  :
-                       //  case TokenNameAND  :
-                       //  case TokenNameMULTIPLY :
-                       //  case TokenNameOR  :
-                       //  case TokenNameDIVIDE :
-                       //  case TokenNameGREATER  :
-                       //  case TokenNameLESS  :
-       }
-}
-protected void consumeTypeDeclarations() {
-       // TypeDeclarations ::= TypeDeclarations TypeDeclaration
-       concatNodeLists();
-}
-protected void consumeTypeDeclarationsopt() {
-       // TypeDeclarationsopt ::= TypeDeclarations
-       int length;
-       if ((length = astLengthStack[astLengthPtr--]) != 0) {
-               astPtr -= length;
-               System.arraycopy(astStack, astPtr + 1, compilationUnit.types = new TypeDeclaration[length], 0, length);
-       }
-}
-protected void consumeTypeImportOnDemandDeclaration() {
-       // TypeImportOnDemandDeclaration ::= TypeImportOnDemandDeclarationName ';'
-
-       ImportReference impt = (ImportReference) astStack[astPtr];
-       // flush annotations defined prior to import statements
-       impt.declarationEnd = endStatementPosition;
-       impt.declarationSourceEnd = 
-               this.flushAnnotationsDefinedPriorTo(impt.declarationSourceEnd); 
-
-       // recovery
-       if (currentElement != null) {
-               lastCheckPoint = impt.declarationSourceEnd + 1;
-               currentElement = currentElement.add(impt, 0);
-               restartRecovery = true;
-               lastIgnoredToken = -1;
-               // used to avoid branching back into the regular automaton
-       }
-}
-protected void consumeTypeImportOnDemandDeclarationName() {
-       // TypeImportOnDemandDeclarationName ::= 'import' Name '.' '*'
-       /* push an ImportRef build from the last name 
-       stored in the identifier stack. */
-
-       ImportReference impt;
-       int length;
-       char[][] tokens = new char[length = identifierLengthStack[identifierLengthPtr--]][];
-       identifierPtr -= length;
-       long[] positions = new long[length];
-       System.arraycopy(identifierStack, identifierPtr + 1, tokens, 0, length);
-       System.arraycopy(identifierPositionStack, identifierPtr + 1, positions, 0, length);
-       pushOnAstStack(impt = new ImportReference(tokens, positions, true));
-
-       if (currentToken == TokenNameSEMICOLON){
-               impt.declarationSourceEnd = scanner.currentPosition - 1;
-       } else {
-               impt.declarationSourceEnd = impt.sourceEnd;
-       }
-       impt.declarationEnd = impt.declarationSourceEnd;
-       //endPosition is just before the ;
-       impt.declarationSourceStart = intStack[intPtr--];
-
-       // recovery
-       if (currentElement != null){
-               lastCheckPoint = impt.declarationSourceEnd+1;
-               currentElement = currentElement.add(impt, 0);
-               lastIgnoredToken = -1;
-               restartRecovery = true; // used to avoid branching back into the regular automaton              
-       }       
-}
-protected void consumeUnaryExpression(int op) {
-       // UnaryExpression ::= '+' PushPosition UnaryExpression
-       // UnaryExpression ::= '-' PushPosition UnaryExpression
-       // UnaryExpressionNotPlusMinus ::= '~' PushPosition UnaryExpression
-       // UnaryExpressionNotPlusMinus ::= '!' PushPosition UnaryExpression
-
-       //optimize the push/pop
-
-       //handle manually the -2147483648 while it is not a real
-       //computation of an - and 2147483648 (notice that 2147483648
-       //is Integer.MAX_VALUE+1.....)
-       //Same for -9223372036854775808L ............
-
-       //intStack have the position of the operator
-
-       Expression r, exp = expressionStack[expressionPtr];
-       if (op == MINUS) {
-               if ((exp instanceof IntLiteral) && (((IntLiteral) exp).mayRepresentMIN_VALUE())) {
-                       r = expressionStack[expressionPtr] = new IntLiteralMinValue();
-               } else {
-                       if ((exp instanceof LongLiteral) && (((LongLiteral) exp).mayRepresentMIN_VALUE())) {
-                               r = expressionStack[expressionPtr] = new LongLiteralMinValue();
-                       } else {
-                               r = expressionStack[expressionPtr] = new UnaryExpression(exp, op);
-                       }
-               }
-       } else {
-               r = expressionStack[expressionPtr] = new UnaryExpression(exp, op);
-       }
-       r.sourceStart = intStack[intPtr--];
-       r.sourceEnd = exp.sourceEnd;
-}
-protected void consumeUnaryExpression(int op, boolean post) {
-       // PreIncrementExpression ::= '++' PushPosition UnaryExpression
-       // PreDecrementExpression ::= '--' PushPosition UnaryExpression
-
-       // ++ and -- operators
-       //optimize the push/pop
-
-       //intStack has the position of the operator when prefix
-
-       Expression leftHandSide = expressionStack[expressionPtr];
-       if (leftHandSide instanceof Reference) {
-               // ++foo()++ is unvalid 
-               if (post) {
-                       expressionStack[expressionPtr] = 
-                               new PostfixExpression(
-                                       leftHandSide,
-                                       IntLiteral.One,
-                                       op,
-                                       endStatementPosition); 
-               } else {
-                       expressionStack[expressionPtr] = 
-                               new PrefixExpression(
-                                       leftHandSide,
-                                       IntLiteral.One,
-                                       op,
-                                       intStack[intPtr--]); 
-               }
-       } else {
-               //the ++ or the -- is NOT taken into account if code gen proceeds
-               if (!post) {
-                       intPtr--;
-               }
-               problemReporter().invalidUnaryExpression(leftHandSide);
-       }
-}
-protected void consumeVariableDeclarators() {
-       // VariableDeclarators ::= VariableDeclarators ',' VariableDeclarator
-       optimizedConcatNodeLists();
-}
-protected void consumeVariableInitializers() {
-       // VariableInitializers ::= VariableInitializers ',' VariableInitializer
-       concatExpressionLists();
-}
-protected TypeReference copyDims(TypeReference typeRef, int dim) {
-       return typeRef.copyDims(dim);
-}
-protected FieldDeclaration createFieldDeclaration(Expression initialization, char[] name, int sourceStart, int sourceEnd) {
-       return new FieldDeclaration(null, name, sourceStart, sourceEnd);
-}
+      case 153 : // System.out.println("StaticInitializer ::= StaticOnly Block");
+        consumeStaticInitializer();
+        break;
 
-protected LocalDeclaration createLocalDeclaration(Expression initialization, char[] name, int sourceStart, int sourceEnd) {
-       return new LocalDeclaration(null, name, sourceStart, sourceEnd);
-}
+      case 154 : // System.out.println("StaticOnly ::= static");
+        consumeStaticOnly();
+        break;
 
-public CompilationUnitDeclaration dietParse(ICompilationUnit sourceUnit, CompilationResult compilationResult) {
-
-       CompilationUnitDeclaration parsedUnit;
-       boolean old = diet;
-       try {
-               diet = true;
-               parsedUnit = parse(sourceUnit, compilationResult);
-       }
-       finally {
-               diet = old;
-       }
-       return parsedUnit;
-}
-protected void dispatchDeclarationInto(int length) {
-       /* they are length on astStack that should go into
-          methods fields constructors lists of the typeDecl
-
-          Return if there is a constructor declaration in the methods declaration */
-          
-       
-       // Looks for the size of each array . 
-
-       if (length == 0)
-               return;
-       int[] flag = new int[length + 1]; //plus one -- see <HERE>
-       int size1 = 0, size2 = 0, size3 = 0;
-       for (int i = length - 1; i >= 0; i--) {
-               AstNode astNode = astStack[astPtr--];
-               if (astNode instanceof AbstractMethodDeclaration) {
-                       //methods and constructors have been regrouped into one single list
-                       flag[i] = 3;
-                       size2++;
-               } else {
-                       if (astNode instanceof TypeDeclaration) {
-                               flag[i] = 4;
-                               size3++;
-                       } else {
-                               //field
-                               flag[i] = 1;
-                               size1++;
-                       }
-               }
-       }
-
-       //arrays creation
-       TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
-       if (size1 != 0)
-               typeDecl.fields = new FieldDeclaration[size1];
-       if (size2 != 0)
-               typeDecl.methods = new AbstractMethodDeclaration[size2];
-       if (size3 != 0)
-               typeDecl.memberTypes = new MemberTypeDeclaration[size3];
-
-       //arrays fill up
-       size1 = size2 = size3 = 0;
-       int flagI = flag[0], start = 0;
-       int length2;
-       for (int end = 0; end <= length; end++) //<HERE> the plus one allows to 
-               {
-               if (flagI != flag[end]) //treat the last element as a ended flag.....
-                       { //array copy
-                       switch (flagI) {
-                               case 1 :
-                                       size1 += (length2 = end - start);
-                                       System.arraycopy(
-                                               astStack, 
-                                               astPtr + start + 1, 
-                                               typeDecl.fields, 
-                                               size1 - length2, 
-                                               length2); 
-                                       break;
-                               case 3 :
-                                       size2 += (length2 = end - start);
-                                       System.arraycopy(
-                                               astStack, 
-                                               astPtr + start + 1, 
-                                               typeDecl.methods, 
-                                               size2 - length2, 
-                                               length2); 
-                                       break;
-                               case 4 :
-                                       size3 += (length2 = end - start);
-                                       System.arraycopy(
-                                               astStack, 
-                                               astPtr + start + 1, 
-                                               typeDecl.memberTypes, 
-                                               size3 - length2, 
-                                               length2); 
-                                       break;
-                       };
-                       flagI = flag[start = end];
-               }
-       }
-
-       if (typeDecl.memberTypes != null) {
-               for (int i = typeDecl.memberTypes.length - 1; i >= 0; i--) {
-                       typeDecl.memberTypes[i].enclosingType = typeDecl;
-               }
-       }
-}
-protected CompilationUnitDeclaration endParse(int act) {
-
-       this.lastAct = act;
-
-       if (currentElement != null){
-               currentElement.topElement().updateParseTree();
-               if (VERBOSE_RECOVERY){
-                       System.out.print(Util.bind("parser.syntaxRecovery")); //$NON-NLS-1$
-                       System.out.println("--------------------------");                //$NON-NLS-1$
-                       System.out.println(compilationUnit);            
-                       System.out.println("----------------------------------"); //$NON-NLS-1$
-               }               
-       } else {
-               if (diet & VERBOSE_RECOVERY){
-                       System.out.print(Util.bind("parser.regularParse"));      //$NON-NLS-1$
-                       System.out.println("--------------------------");        //$NON-NLS-1$
-                       System.out.println(compilationUnit);            
-                       System.out.println("----------------------------------"); //$NON-NLS-1$
-               }
-       }
-       if (scanner.recordLineSeparator) {
-               compilationUnit.compilationResult.lineSeparatorPositions = scanner.getLineEnds();
-       }
-       return compilationUnit;
-}
-/*
- * Flush annotations defined prior to a given positions.
- *
- * Note: annotations are stacked in syntactical order
- *
- * Either answer given <position>, or the end position of a comment line 
- * immediately following the <position> (same line)
- *
- * e.g.
- * void foo(){
- * } // end of method foo
- */
-public int flushAnnotationsDefinedPriorTo(int position) {
-
-       int lastAnnotationIndex = scanner.commentPtr;
-       if (lastAnnotationIndex < 0) return position; // no comment
-
-       // compute the index of the first obsolete comment
-       int index = lastAnnotationIndex;
-       int validCount = 0;
-       while (index >= 0){
-               int commentEnd = scanner.commentStops[index];
-               if (commentEnd < 0) commentEnd = -commentEnd; // negative end position for non-javadoc comments
-               if (commentEnd <= position){
-                       break;
-               }
-               index--;
-               validCount++;
-       }
-       // if the source at <position> is immediately followed by a line comment, then
-       // flush this comment and shift <position> to the comment end.
-       if (validCount > 0){
-               int immediateCommentEnd = -scanner.commentStops[index+1]; //non-javadoc comment end positions are negative
-               if (immediateCommentEnd > 0){ // only tolerating non-javadoc comments
-                       // is there any line break until the end of the immediate comment ? (thus only tolerating line comment)
-                       immediateCommentEnd--; // comment end in one char too far
-                       if (scanner.getLineNumber(position) == scanner.getLineNumber(immediateCommentEnd)){
-                               position = immediateCommentEnd;
-                               validCount--; // flush this comment
-                               index++;
-                       }
-               }
-       }
-       // position can be located in the middle of a line break
-       // this is a bug on Windows platform only.
-       // http://dev.eclipse.org/bugs/show_bug.cgi?id=10557
-       char[] source = scanner.source;
-       
-       if ((position < source.length)
-               && (source[position] == '\r')
-           && ((position + 1) < source.length)
-           && (source[position + 1] == '\n')) {
-               position++;
-       }
-       if (index < 0) return position; // no obsolete comment
-
-       if (validCount > 0){ // move valid comment infos, overriding obsolete comment infos
-               System.arraycopy(scanner.commentStarts, index + 1, scanner.commentStarts, 0, validCount);
-               System.arraycopy(scanner.commentStops, index + 1, scanner.commentStops, 0, validCount);         
-       }
-       scanner.commentPtr = validCount - 1;
-       return position;
-}
-public final int getFirstToken() {
-       // the first token is a virtual token that
-       // allows the parser to parse several goals
-       // even if they aren't LALR(1)....
-       // Goal ::= '++' CompilationUnit
-       // Goal ::= '--' MethodBody
-       // Goal ::= '==' ConstructorBody
-       // -- Initializer
-       // Goal ::= '>>' StaticInitializer
-       // Goal ::= '>>' Block
-       // -- error recovery
-       // Goal ::= '>>>' Headers
-       // Goal ::= '*' BlockStatements
-       // Goal ::= '*' MethodPushModifiersHeader
-       // -- JDOM
-       // Goal ::= '&&' FieldDeclaration
-       // Goal ::= '||' ImportDeclaration
-       // Goal ::= '?' PackageDeclaration
-       // Goal ::= '+' TypeDeclaration
-       // Goal ::= '/' GenericMethodDeclaration
-       // Goal ::= '&' ClassBodyDeclaration
-       // -- code snippet
-       // Goal ::= '%' Expression
-       // -- completion parser
-       // Goal ::= '!' ConstructorBlockStatementsopt
-       // Goal ::= '~' BlockStatementsopt
-       
-       return firstToken;
-}
-/*
- * Answer back an array of sourceStart/sourceEnd positions of the available JavaDoc comments.
- * The array is a flattened structure: 2*n entries with consecutives start and end positions.
- *
- * If no JavaDoc is available, then null is answered instead of an empty array.
- *
- * e.g. { 10, 20, 25, 45 }  --> javadoc1 from 10 to 20, javadoc2 from 25 to 45
- */
-public int[] getJavaDocPositions() {
-
-       int javadocCount = 0;
-       for (int i = 0, max = scanner.commentPtr; i <= max; i++){
-               // javadoc only (non javadoc comment have negative end positions.)
-               if (scanner.commentStops[i] > 0){
-                       javadocCount++;
-               }
-       }
-       if (javadocCount == 0) return null;
-
-       int[] positions = new int[2*javadocCount];
-       int index = 0;
-       for (int i = 0, max = scanner.commentPtr; i <= max; i++){
-               // javadoc only (non javadoc comment have negative end positions.)
-               if (scanner.commentStops[i] > 0){
-                       positions[index++] = scanner.commentStarts[i];
-                       positions[index++] = scanner.commentStops[i]-1; //stop is one over                      
-               }
-       }
-       return positions;
-}
-       protected void getMethodBodies(CompilationUnitDeclaration unit) {
-               //fill the methods bodies in order for the code to be generated
-
-               if (unit == null) return;
-               
-               if (unit.ignoreMethodBodies) {
-                       unit.ignoreFurtherInvestigation = true;
-                       return;
-                       // if initial diet parse did not work, no need to dig into method bodies.
-               }
-
-               //real parse of the method....
-               this.scanner.setSource(
-                       unit.compilationResult.compilationUnit.getContents());
-               if (unit.types != null) {
-                       for (int i = unit.types.length; --i >= 0;)
-                               unit.types[i].parseMethod(this, unit);
-               }
-       }
-protected TypeReference getTypeReference(int dim) { /* build a Reference on a variable that may be qualified or not
-This variable is a type reference and dim will be its dimensions*/
-
-       int length;
-       TypeReference ref;
-       if ((length = identifierLengthStack[identifierLengthPtr--]) == 1) {
-               // single variable reference
-               if (dim == 0) {
-                       ref = 
-                               new SingleTypeReference(
-                                       identifierStack[identifierPtr], 
-                                       identifierPositionStack[identifierPtr--]); 
-               } else {
-                       ref = 
-                               new ArrayTypeReference(
-                                       identifierStack[identifierPtr], 
-                                       dim, 
-                                       identifierPositionStack[identifierPtr--]); 
-                       ref.sourceEnd = endPosition;                    
-               }
-       } else {
-               if (length < 0) { //flag for precompiled type reference on base types
-                       ref = TypeReference.baseTypeReference(-length, dim);
-                       ref.sourceStart = intStack[intPtr--];
-                       if (dim == 0) {
-                               ref.sourceEnd = intStack[intPtr--];
-                       } else {
-                               intPtr--;
-                               ref.sourceEnd = endPosition;
-                       }
-               } else { //Qualified variable reference
-                       char[][] tokens = new char[length][];
-                       identifierPtr -= length;
-                       long[] positions = new long[length];
-                       System.arraycopy(identifierStack, identifierPtr + 1, tokens, 0, length);
-                       System.arraycopy(
-                               identifierPositionStack, 
-                               identifierPtr + 1, 
-                               positions, 
-                               0, 
-                               length); 
-                       if (dim == 0) {
-                               ref = new QualifiedTypeReference(tokens, positions);
-                       } else {
-                               ref = new ArrayQualifiedTypeReference(tokens, dim, positions);
-                               ref.sourceEnd = endPosition;
-                       }
-               }
-       };
-       return ref;
-}
-protected Expression getTypeReference(Expression exp) {
-       
-       exp.bits &= ~AstNode.RestrictiveFlagMASK;
-       exp.bits |= TYPE;
-       return exp;
-}
-protected NameReference getUnspecifiedReference() {
-       /* build a (unspecified) NameReference which may be qualified*/
-
-       int length;
-       NameReference ref;
-       if ((length = identifierLengthStack[identifierLengthPtr--]) == 1)
-               // single variable reference
-               ref = 
-                       new SingleNameReference(
-                               identifierStack[identifierPtr], 
-                               identifierPositionStack[identifierPtr--]); 
-       else
-               //Qualified variable reference
-               {
-               char[][] tokens = new char[length][];
-               identifierPtr -= length;
-               System.arraycopy(identifierStack, identifierPtr + 1, tokens, 0, length);
-               ref = 
-                       new QualifiedNameReference(tokens, 
-                               (int) (identifierPositionStack[identifierPtr + 1] >> 32), // sourceStart
-                               (int) identifierPositionStack[identifierPtr + length]); // sourceEnd
-       };
-       return ref;
-}
-protected NameReference getUnspecifiedReferenceOptimized() {
-       /* build a (unspecified) NameReference which may be qualified
-       The optimization occurs for qualified reference while we are
-       certain in this case the last item of the qualified name is
-       a field access. This optimization is IMPORTANT while it results
-       that when a NameReference is build, the type checker should always
-       look for that it is not a type reference */
-
-       int length;
-       NameReference ref;
-       if ((length = identifierLengthStack[identifierLengthPtr--]) == 1) {
-               // single variable reference
-               ref = 
-                       new SingleNameReference(
-                               identifierStack[identifierPtr], 
-                               identifierPositionStack[identifierPtr--]); 
-               ref.bits &= ~AstNode.RestrictiveFlagMASK;
-               ref.bits |= LOCAL | FIELD;
-               return ref;
-       }
-
-       //Qualified-variable-reference
-       //In fact it is variable-reference DOT field-ref , but it would result in a type
-       //conflict tha can be only reduce by making a superclass (or inetrface ) between
-       //nameReference and FiledReference or putting FieldReference under NameReference
-       //or else..........This optimisation is not really relevant so just leave as it is
-
-       char[][] tokens = new char[length][];
-       identifierPtr -= length;
-       System.arraycopy(identifierStack, identifierPtr + 1, tokens, 0, length);
-       ref = new QualifiedNameReference(
-                       tokens, 
-                       (int) (identifierPositionStack[identifierPtr + 1] >> 32), // sourceStart
-                       (int) identifierPositionStack[identifierPtr + length]); // sourceEnd
-       ref.bits &= ~AstNode.RestrictiveFlagMASK;
-       ref.bits |= LOCAL | FIELD;
-       return ref;
-}
-public void goForBlockStatementsOrMethodHeaders() {
-       //tells the scanner to go for block statements or method headers parsing 
+      case 155 : // System.out.println("ConstructorDeclaration ::= ConstructorHeader ConstructorBody");
+        consumeConstructorDeclaration();
+        break;
 
-       firstToken = TokenNameMULTIPLY;
-       scanner.recordLineSeparator = false;
-}
-public void goForClassBodyDeclarations() {
-       //tells the scanner to go for any body declarations parsing
+      case 156 : // System.out.println("ConstructorDeclaration ::= ConstructorHeader SEMICOLON");
+        consumeInvalidConstructorDeclaration();
+        break;
 
-       firstToken = TokenNameAND;
-       scanner.recordLineSeparator = true;
-}
-public void goForCompilationUnit(){
-       //tells the scanner to go for compilation unit parsing
-
-       firstToken = TokenNamePLUS_PLUS ;
-       scanner.linePtr = -1;   
-       scanner.recordLineSeparator = true;
-       scanner.currentLine= null;
-       scanner.lines= new ArrayList();
-}
-public void goForConstructorBody(){
-       //tells the scanner to go for compilation unit parsing
+      case 157 : // System.out.println("ConstructorBody ::= NestedMethod LBRACE ConstructorBlockStatementsopt RBRACE");
+        consumeConstructorBody();
+        break;
 
-       firstToken = TokenNameEQUAL_EQUAL ;
-       scanner.recordLineSeparator = false;
-}
-public void goForExpression() {
-       //tells the scanner to go for an expression parsing
+      case 160 : // System.out.println("ConstructorBlockStatementsopt ::= ExplicitConstructorInvocation BlockStatements");
+        consumeConstructorBlockStatements();
+        break;
 
-       firstToken = TokenNameREMAINDER;
-       scanner.recordLineSeparator = false;
-}
-public void goForFieldDeclaration(){
-       //tells the scanner to go for field declaration parsing
+      case 161 : // System.out.println("ExplicitConstructorInvocation ::= this LPAREN ArgumentListopt RPAREN SEMICOLON");
+        consumeExplicitConstructorInvocation(0, ExplicitConstructorCall.This);
+        break;
 
-       firstToken = TokenNameAND_AND ;
-       scanner.recordLineSeparator = true;
-}
-public void goForGenericMethodDeclaration(){
-       //tells the scanner to go for generic method declarations parsing
+      case 162 : // System.out.println("ExplicitConstructorInvocation ::= super LPAREN ArgumentListopt RPAREN SEMICOLON");
+        consumeExplicitConstructorInvocation(0, ExplicitConstructorCall.Super);
+        break;
 
-       firstToken = TokenNameDIVIDE;
-       scanner.recordLineSeparator = true;
-}
-public void goForHeaders(){
-       //tells the scanner to go for headers only parsing
+      case 163 : // System.out.println("ExplicitConstructorInvocation ::= Primary DOT super LPAREN ArgumentListopt RPAREN");
+        consumeExplicitConstructorInvocation(1, ExplicitConstructorCall.Super);
+        break;
 
-       firstToken = TokenNameUNSIGNED_RIGHT_SHIFT;
-       scanner.recordLineSeparator = true;
-}
-public void goForImportDeclaration(){
-       //tells the scanner to go for import declaration parsing
+      case 164 : // System.out.println("ExplicitConstructorInvocation ::= Name DOT super LPAREN ArgumentListopt RPAREN...");
+        consumeExplicitConstructorInvocation(2, ExplicitConstructorCall.Super);
+        break;
 
-       firstToken = TokenNameOR_OR ;
-       scanner.recordLineSeparator = true;
-}
-public void goForInitializer(){
-       //tells the scanner to go for initializer parsing
+      case 165 : // System.out.println("ExplicitConstructorInvocation ::= Primary DOT this LPAREN ArgumentListopt RPAREN...");
+        consumeExplicitConstructorInvocation(1, ExplicitConstructorCall.This);
+        break;
 
-       firstToken = TokenNameRIGHT_SHIFT ;
-       scanner.recordLineSeparator = false;
-}
-public void goForMethodBody(){
-       //tells the scanner to go for method body parsing
+      case 166 : // System.out.println("ExplicitConstructorInvocation ::= Name DOT this LPAREN ArgumentListopt RPAREN...");
+        consumeExplicitConstructorInvocation(2, ExplicitConstructorCall.This);
+        break;
 
-       firstToken = TokenNameMINUS_MINUS ;
-       scanner.recordLineSeparator = false;
-}
-public void goForPackageDeclaration() {
-       //tells the scanner to go for package declaration parsing
+      case 167 : // System.out.println("InterfaceDeclaration ::= InterfaceHeader InterfaceBody");
+        consumeInterfaceDeclaration();
+        break;
 
-       firstToken = TokenNameQUESTION;
-       scanner.recordLineSeparator = true;
-}
-public void goForTypeDeclaration() {
-       //tells the scanner to go for type (interface or class) declaration parsing
+      case 168 : // System.out.println("InterfaceHeader ::= InterfaceHeaderName InterfaceHeaderExtendsopt");
+        consumeInterfaceHeader();
+        break;
 
-       firstToken = TokenNamePLUS;
-       scanner.recordLineSeparator = true;
-}
-public final static void grammar(){
-/*
---main options
-%options ACTION, AN=JavaAction.java, GP=java, 
-%options FILE-PREFIX=java, ESCAPE=$, PREFIX=TokenName, OUTPUT-SIZE=125 ,
-%options NOGOTO-DEFAULT, SINGLE-PRODUCTIONS, LALR=1 , TABLE=TIME , 
-
---error recovering options.....
-%options ERROR_MAPS 
-
---grammar understanding options
-%options first follow
-%options TRACE=FULL ,
-%options VERBOSE
-
---Usefull macros helping reading/writing semantic actions
-$Define 
-$putCase 
-/.    case $rule_number : // System.out.println("$rule_text");  
-                  ./
-
-$break
-/. 
-                       break ;
-./
-
--- here it starts really ------------------------------------------
-$Terminals
-
-       Identifier
-
-       abstract assert boolean break byte case catch char class 
-       continue default do double else extends false final finally float
-       for if implements import instanceof int
-       interface long native new null package private
-       protected public return short static strictfp super switch
-       synchronized this throw throws transient true try void
-       volatile while
-
-       IntegerLiteral
-       LongLiteral
-       FloatingPointLiteral
-       DoubleLiteral
-       CharacterLiteral
-       StringLiteral
-
-       PLUS_PLUS
-       MINUS_MINUS
-       EQUAL_EQUAL
-       LESS_EQUAL
-       GREATER_EQUAL
-       NOT_EQUAL
-       LEFT_SHIFT
-       RIGHT_SHIFT
-       UNSIGNED_RIGHT_SHIFT
-       PLUS_EQUAL
-       MINUS_EQUAL
-       MULTIPLY_EQUAL
-       DIVIDE_EQUAL
-       AND_EQUAL
-       OR_EQUAL
-       XOR_EQUAL
-       REMAINDER_EQUAL
-       LEFT_SHIFT_EQUAL
-       RIGHT_SHIFT_EQUAL
-       UNSIGNED_RIGHT_SHIFT_EQUAL
-       OR_OR
-       AND_AND
-       PLUS
-       MINUS
-       NOT
-       REMAINDER
-       XOR
-       AND
-       MULTIPLY
-       OR
-       TWIDDLE
-       DIVIDE
-       GREATER
-       LESS
-       LPAREN
-       RPAREN
-       LBRACE
-       RBRACE
-       LBRACKET
-       RBRACKET
-       SEMICOLON
-       QUESTION
-       COLON
-       COMMA
-       DOT
-       EQUAL
-
---    BodyMarker
-
-$Alias
-
-       '++'   ::= PLUS_PLUS
-       '--'   ::= MINUS_MINUS
-       '=='   ::= EQUAL_EQUAL
-       '<='   ::= LESS_EQUAL
-       '>='   ::= GREATER_EQUAL
-       '!='   ::= NOT_EQUAL
-       '<<'   ::= LEFT_SHIFT
-       '>>'   ::= RIGHT_SHIFT
-       '>>>'  ::= UNSIGNED_RIGHT_SHIFT
-       '+='   ::= PLUS_EQUAL
-       '-='   ::= MINUS_EQUAL
-       '*='   ::= MULTIPLY_EQUAL
-       '/='   ::= DIVIDE_EQUAL
-       '&='   ::= AND_EQUAL
-       '|='   ::= OR_EQUAL
-       '^='   ::= XOR_EQUAL
-       '%='   ::= REMAINDER_EQUAL
-       '<<='  ::= LEFT_SHIFT_EQUAL
-       '>>='  ::= RIGHT_SHIFT_EQUAL
-       '>>>=' ::= UNSIGNED_RIGHT_SHIFT_EQUAL
-       '||'   ::= OR_OR
-       '&&'   ::= AND_AND
-
-       '+'    ::= PLUS
-       '-'    ::= MINUS
-       '!'    ::= NOT
-       '%'    ::= REMAINDER
-       '^'    ::= XOR
-       '&'    ::= AND
-       '*'    ::= MULTIPLY
-       '|'    ::= OR
-       '~'    ::= TWIDDLE
-       '/'    ::= DIVIDE
-       '>'    ::= GREATER
-       '<'    ::= LESS
-       '('    ::= LPAREN
-       ')'    ::= RPAREN
-       '{'    ::= LBRACE
-       '}'    ::= RBRACE
-       '['    ::= LBRACKET
-       ']'    ::= RBRACKET
-       ';'    ::= SEMICOLON
-       '?'    ::= QUESTION
-       ':'    ::= COLON
-       ','    ::= COMMA
-       '.'    ::= DOT
-       '='    ::= EQUAL
-       
-$Start
-       Goal
-
-$Rules
-
-/. // This method is part of an automatic generation : do NOT edit-modify  
-protected void consumeRule(int act) {
-  switch ( act ) {
-./
-
-
-
-Goal ::= '++' CompilationUnit
-Goal ::= '--' MethodBody
-Goal ::= '==' ConstructorBody
--- Initializer
-Goal ::= '>>' StaticInitializer
-Goal ::= '>>' Initializer
--- error recovery
-Goal ::= '>>>' Headers
-Goal ::= '*' BlockStatements
-Goal ::= '*' MethodPushModifiersHeader
-Goal ::= '*' CatchHeader
--- JDOM
-Goal ::= '&&' FieldDeclaration
-Goal ::= '||' ImportDeclaration
-Goal ::= '?' PackageDeclaration
-Goal ::= '+' TypeDeclaration
-Goal ::= '/' GenericMethodDeclaration
-Goal ::= '&' ClassBodyDeclaration
--- code snippet
-Goal ::= '%' Expression
--- completion parser
-Goal ::= '!' ConstructorBlockStatementsopt
-Goal ::= '~' BlockStatementsopt
-
-Literal -> IntegerLiteral
-Literal -> LongLiteral
-Literal -> FloatingPointLiteral
-Literal -> DoubleLiteral
-Literal -> CharacterLiteral
-Literal -> StringLiteral
-Literal -> null
-Literal -> BooleanLiteral
-BooleanLiteral -> true
-BooleanLiteral -> false
-
--------------------------------------------------------------
--------------------------------------------------------------
---a Type results in both a push of its dimension(s) and its name(s).
-
-Type ::= PrimitiveType
- /.$putCase consumePrimitiveType(); $break ./
-Type -> ReferenceType
-
-PrimitiveType -> NumericType
-NumericType -> IntegralType
-NumericType -> FloatingPointType
-
-PrimitiveType -> 'boolean'
-PrimitiveType -> 'void'
-IntegralType -> 'byte'
-IntegralType -> 'short'
-IntegralType -> 'int'
-IntegralType -> 'long'
-IntegralType -> 'char'
-FloatingPointType -> 'float'
-FloatingPointType -> 'double'
-
-ReferenceType ::= ClassOrInterfaceType
-/.$putCase consumeReferenceType();  $break ./
-ReferenceType -> ArrayType -- here a push of dimensions is done, that explains the two previous push 0
-
-ClassOrInterfaceType -> Name
-
---
--- These rules have been rewritten to avoid some conflicts introduced
--- by adding the 1.1 features
---
--- ArrayType ::= PrimitiveType '[' ']'
--- ArrayType ::= Name '[' ']'
--- ArrayType ::= ArrayType '[' ']'
---
-
-ArrayType ::= PrimitiveType Dims
-ArrayType ::= Name Dims
-
-ClassType -> ClassOrInterfaceType
-
-
---------------------------------------------------------------
---------------------------------------------------------------
-
-Name -> SimpleName
-Name -> QualifiedName
-
-SimpleName -> 'Identifier'
-
-QualifiedName ::= Name '.' SimpleName 
-/.$putCase consumeQualifiedName(); $break ./
-
-CompilationUnit ::= EnterCompilationUnit PackageDeclarationopt ImportDeclarationsopt TypeDeclarationsopt
-/.$putCase consumeCompilationUnit(); $break ./
-
-EnterCompilationUnit ::= $empty
-/.$putCase consumeEnterCompilationUnit(); $break ./
-
-Headers -> Header
-Headers ::= Headers Header
-
-Header -> ImportDeclaration
-Header -> PackageDeclaration
-Header -> ClassHeader
-Header -> InterfaceHeader
-Header -> StaticInitializer
-Header -> MethodHeader
-Header -> ConstructorHeader
-Header -> FieldDeclaration
-Header -> AllocationHeader
-
-CatchHeader ::= 'catch' '(' FormalParameter ')' '{'
-/.$putCase consumeCatchHeader(); $break ./
-
-ImportDeclarations -> ImportDeclaration
-ImportDeclarations ::= ImportDeclarations ImportDeclaration 
-/.$putCase consumeImportDeclarations(); $break ./
-
-TypeDeclarations -> TypeDeclaration
-TypeDeclarations ::= TypeDeclarations TypeDeclaration
-/.$putCase consumeTypeDeclarations(); $break ./
-
-PackageDeclaration ::= PackageDeclarationName ';'
-/.$putCase  consumePackageDeclaration(); $break ./
-
-PackageDeclarationName ::= 'package' Name
-/.$putCase  consumePackageDeclarationName(); $break ./
-
-ImportDeclaration -> SingleTypeImportDeclaration
-ImportDeclaration -> TypeImportOnDemandDeclaration
-
-SingleTypeImportDeclaration ::= SingleTypeImportDeclarationName ';'
-/.$putCase consumeSingleTypeImportDeclaration(); $break ./
-                         
-SingleTypeImportDeclarationName ::= 'import' Name
-/.$putCase consumeSingleTypeImportDeclarationName(); $break ./
-                         
-TypeImportOnDemandDeclaration ::= TypeImportOnDemandDeclarationName ';'
-/.$putCase consumeTypeImportOnDemandDeclaration(); $break ./
-
-TypeImportOnDemandDeclarationName ::= 'import' Name '.' '*'
-/.$putCase consumeTypeImportOnDemandDeclarationName(); $break ./
-
-TypeDeclaration -> ClassDeclaration
-TypeDeclaration -> InterfaceDeclaration
--- this declaration in part of a list od declaration and we will
--- use and optimized list length calculation process 
--- thus we decrement the number while it will be incremend.....
-TypeDeclaration ::= ';' 
-/. $putCase consumeEmptyTypeDeclaration(); $break ./
-
---18.7 Only in the LALR(1) Grammar
-
-Modifiers ::= Modifier
-Modifiers ::= Modifiers Modifier
-
-Modifier -> 'public' 
-Modifier -> 'protected'
-Modifier -> 'private'
-Modifier -> 'static'
-Modifier -> 'abstract'
-Modifier -> 'final'
-Modifier -> 'native'
-Modifier -> 'synchronized'
-Modifier -> 'transient'
-Modifier -> 'volatile'
-Modifier -> 'strictfp'
-
---18.8 Productions from 8: Class Declarations
---ClassModifier ::=
---      'abstract'
---    | 'final'
---    | 'public'
---18.8.1 Productions from 8.1: Class Declarations
+      case 169 : // System.out.println("InterfaceHeaderName ::= Modifiersopt interface Identifier");
+        consumeInterfaceHeaderName();
+        break;
 
-ClassDeclaration ::= ClassHeader ClassBody
-/.$putCase consumeClassDeclaration(); $break ./
+      case 171 : // System.out.println("InterfaceHeaderExtends ::= extends InterfaceTypeList");
+        consumeInterfaceHeaderExtends();
+        break;
 
-ClassHeader ::= ClassHeaderName ClassHeaderExtendsopt ClassHeaderImplementsopt
-/.$putCase consumeClassHeader(); $break ./
-
-ClassHeaderName ::= Modifiersopt 'class' 'Identifier'
-/.$putCase consumeClassHeaderName(); $break ./
-
-ClassHeaderExtends ::= 'extends' ClassType
-/.$putCase consumeClassHeaderExtends(); $break ./
-
-ClassHeaderImplements ::= 'implements' InterfaceTypeList
-/.$putCase consumeClassHeaderImplements(); $break ./
-
-InterfaceTypeList -> InterfaceType
-InterfaceTypeList ::= InterfaceTypeList ',' InterfaceType
-/.$putCase consumeInterfaceTypeList(); $break ./
-
-InterfaceType ::= ClassOrInterfaceType
-/.$putCase consumeInterfaceType(); $break ./
-
-ClassBody ::= '{' ClassBodyDeclarationsopt '}'
-
-ClassBodyDeclarations ::= ClassBodyDeclaration
-ClassBodyDeclarations ::= ClassBodyDeclarations ClassBodyDeclaration
-/.$putCase consumeClassBodyDeclarations(); $break ./
-
-ClassBodyDeclaration -> ClassMemberDeclaration
-ClassBodyDeclaration -> StaticInitializer
-ClassBodyDeclaration -> ConstructorDeclaration
---1.1 feature
-ClassBodyDeclaration ::= Diet NestedMethod Block
-/.$putCase consumeClassBodyDeclaration(); $break ./
-Diet ::= $empty
-/.$putCase consumeDiet(); $break./
-
-Initializer ::= Diet NestedMethod Block
-/.$putCase consumeClassBodyDeclaration(); $break ./
-
-ClassMemberDeclaration -> FieldDeclaration
-ClassMemberDeclaration -> MethodDeclaration
---1.1 feature
-ClassMemberDeclaration -> ClassDeclaration
---1.1 feature
-ClassMemberDeclaration -> InterfaceDeclaration
-
--- Empty declarations are not valid Java ClassMemberDeclarations.
--- However, since the current (2/14/97) Java compiler accepts them 
--- (in fact, some of the official tests contain this erroneous
--- syntax)
-
-GenericMethodDeclaration -> MethodDeclaration
-GenericMethodDeclaration -> ConstructorDeclaration
-
-ClassMemberDeclaration ::= ';'
-/.$putCase consumeEmptyClassMemberDeclaration(); $break./
-
---18.8.2 Productions from 8.3: Field Declarations
---VariableModifier ::=
---      'public'
---    | 'protected'
---    | 'private'
---    | 'static'
---    | 'final'
---    | 'transient'
---    | 'volatile'
+      case 174 : // System.out.println("InterfaceMemberDeclarations ::= InterfaceMemberDeclarations...");
+        consumeInterfaceMemberDeclarations();
+        break;
 
-FieldDeclaration ::= Modifiersopt Type VariableDeclarators ';'
-/.$putCase consumeFieldDeclaration(); $break ./
+      case 175 : // System.out.println("InterfaceMemberDeclaration ::= SEMICOLON");
+        consumeEmptyInterfaceMemberDeclaration();
+        break;
 
-VariableDeclarators -> VariableDeclarator 
-VariableDeclarators ::= VariableDeclarators ',' VariableDeclarator
-/.$putCase consumeVariableDeclarators(); $break ./
+      case 178 : // System.out.println("InterfaceMemberDeclaration ::= InvalidMethodDeclaration");
+        ignoreMethodBody();
+        break;
 
-VariableDeclarator ::= VariableDeclaratorId EnterVariable ExitVariableWithoutInitialization
+      case 179 : // System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader ConstructorBody");
+        ignoreInvalidConstructorDeclaration(true);
+        break;
 
-VariableDeclarator ::= VariableDeclaratorId EnterVariable '=' ForceNoDiet VariableInitializer RestoreDiet ExitVariableWithInitialization
+      case 180 : // System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader SEMICOLON");
+        ignoreInvalidConstructorDeclaration(false);
+        break;
 
-EnterVariable ::= $empty
-/.$putCase consumeEnterVariable(); $break ./
+      case 186 : // System.out.println("ArrayInitializer ::= LBRACE ,opt RBRACE");
+        consumeEmptyArrayInitializer();
+        break;
 
-ExitVariableWithInitialization ::= $empty
-/.$putCase consumeExitVariableWithInitialization(); $break ./
+      case 187 : // System.out.println("ArrayInitializer ::= LBRACE VariableInitializers RBRACE");
+        consumeArrayInitializer();
+        break;
 
-ExitVariableWithoutInitialization ::= $empty
-/.$putCase consumeExitVariableWithoutInitialization(); $break ./
+      case 188 : // System.out.println("ArrayInitializer ::= LBRACE VariableInitializers COMMA RBRACE");
+        consumeArrayInitializer();
+        break;
 
-ForceNoDiet ::= $empty
-/.$putCase consumeForceNoDiet(); $break ./
-RestoreDiet ::= $empty
-/.$putCase consumeRestoreDiet(); $break ./
+      case 190 : // System.out.println("VariableInitializers ::= VariableInitializers COMMA VariableInitializer");
+        consumeVariableInitializers();
+        break;
 
-VariableDeclaratorId ::= 'Identifier' Dimsopt
+      case 191 : // System.out.println("Block ::= OpenBlock LBRACE BlockStatementsopt RBRACE");
+        consumeBlock();
+        break;
 
-VariableInitializer -> Expression
-VariableInitializer -> ArrayInitializer
+      case 192 : // System.out.println("OpenBlock ::=");
+        consumeOpenBlock();
+        break;
 
---18.8.3 Productions from 8.4: Method Declarations
---MethodModifier ::=
---      'public'
---    | 'protected'
---    | 'private'
---    | 'static'
---    | 'abstract'
---    | 'final'
---    | 'native'
---    | 'synchronized'
---
+      case 194 : // System.out.println("BlockStatements ::= BlockStatements BlockStatement");
+        consumeBlockStatements();
+        break;
 
-MethodDeclaration -> AbstractMethodDeclaration
-MethodDeclaration ::= MethodHeader MethodBody 
-/.$putCase // set to true to consume a method with a body
-  consumeMethodDeclaration(true);  $break ./
+      case 198 : // System.out.println("BlockStatement ::= InvalidInterfaceDeclaration");
+        ignoreInterfaceDeclaration();
+        break;
 
-AbstractMethodDeclaration ::= MethodHeader ';'
-/.$putCase // set to false to consume a method without body
-  consumeMethodDeclaration(false); $break ./
+      case 199 : // System.out.println("LocalVariableDeclarationStatement ::= LocalVariableDeclaration SEMICOLON");
+        consumeLocalVariableDeclarationStatement();
+        break;
 
-MethodHeader ::= MethodHeaderName MethodHeaderParameters MethodHeaderExtendedDims MethodHeaderThrowsClauseopt
-/.$putCase consumeMethodHeader(); $break ./
+      case 200 : // System.out.println("LocalVariableDeclaration ::= Type PushModifiers VariableDeclarators");
+        consumeLocalVariableDeclaration();
+        break;
 
-MethodPushModifiersHeader ::= MethodPushModifiersHeaderName MethodHeaderParameters MethodHeaderExtendedDims MethodHeaderThrowsClauseopt
-/.$putCase consumeMethodHeader(); $break ./
+      case 201 : // System.out.println("LocalVariableDeclaration ::= Modifiers Type PushModifiers VariableDeclarators");
+        consumeLocalVariableDeclaration();
+        break;
 
-MethodPushModifiersHeaderName ::= Modifiers Type PushModifiers 'Identifier' '(' 
-/.$putCase consumeMethodPushModifiersHeaderName(); $break ./
+      case 202 : // System.out.println("PushModifiers ::=");
+        consumePushModifiers();
+        break;
 
-MethodPushModifiersHeaderName ::= Type PushModifiers 'Identifier' '(' 
-/.$putCase consumeMethodPushModifiersHeaderName(); $break ./
+      case 226 : // System.out.println("EmptyStatement ::= SEMICOLON");
+        consumeEmptyStatement();
+        break;
 
-MethodHeaderName ::= Modifiersopt Type 'Identifier' '('
-/.$putCase consumeMethodHeaderName(); $break ./
+      case 227 : // System.out.println("LabeledStatement ::= Identifier COLON Statement");
+        consumeStatementLabel();
+        break;
 
-MethodHeaderParameters ::= FormalParameterListopt ')'
-/.$putCase consumeMethodHeaderParameters(); $break ./
+      case 228 : // System.out.println("LabeledStatementNoShortIf ::= Identifier COLON StatementNoShortIf");
+        consumeStatementLabel();
+        break;
 
-MethodHeaderExtendedDims ::= Dimsopt
-/.$putCase consumeMethodHeaderExtendedDims(); $break ./
+      case 229 : // System.out.println("ExpressionStatement ::= StatementExpression SEMICOLON");
+        consumeExpressionStatement();
+        break;
 
-MethodHeaderThrowsClause ::= 'throws' ClassTypeList
-/.$putCase consumeMethodHeaderThrowsClause(); $break ./
+      case 237 : // System.out.println("IfThenStatement ::= if LPAREN Expression RPAREN Statement");
+        consumeStatementIfNoElse();
+        break;
 
-ConstructorHeader ::= ConstructorHeaderName MethodHeaderParameters MethodHeaderThrowsClauseopt
-/.$putCase consumeConstructorHeader(); $break ./
+      case 238 : // System.out.println("IfThenElseStatement ::= if LPAREN Expression RPAREN StatementNoShortIf else...");
+        consumeStatementIfWithElse();
+        break;
 
-ConstructorHeaderName ::=  Modifiersopt 'Identifier' '('
-/.$putCase consumeConstructorHeaderName(); $break ./
+      case 239 : // System.out.println("IfThenElseStatementNoShortIf ::= if LPAREN Expression RPAREN StatementNoShortIf...");
+        consumeStatementIfWithElse();
+        break;
 
-FormalParameterList -> FormalParameter
-FormalParameterList ::= FormalParameterList ',' FormalParameter
-/.$putCase consumeFormalParameterList(); $break ./
+      case 240 : // System.out.println("SwitchStatement ::= switch OpenBlock LPAREN Expression RPAREN SwitchBlock");
+        consumeStatementSwitch();
+        break;
 
---1.1 feature
-FormalParameter ::= Modifiersopt Type VariableDeclaratorId
-/.$putCase // the boolean is used to know if the modifiers should be reset
-       consumeFormalParameter(); $break ./
+      case 241 : // System.out.println("SwitchBlock ::= LBRACE RBRACE");
+        consumeEmptySwitchBlock();
+        break;
 
-ClassTypeList -> ClassTypeElt
-ClassTypeList ::= ClassTypeList ',' ClassTypeElt
-/.$putCase consumeClassTypeList(); $break ./
+      case 244 : // System.out.println("SwitchBlock ::= LBRACE SwitchBlockStatements SwitchLabels RBRACE");
+        consumeSwitchBlock();
+        break;
 
-ClassTypeElt ::= ClassType
-/.$putCase consumeClassTypeElt(); $break ./
+      case 246 : // System.out.println("SwitchBlockStatements ::= SwitchBlockStatements SwitchBlockStatement");
+        consumeSwitchBlockStatements();
+        break;
 
+      case 247 : // System.out.println("SwitchBlockStatement ::= SwitchLabels BlockStatements");
+        consumeSwitchBlockStatement();
+        break;
 
-MethodBody ::= NestedMethod '{' BlockStatementsopt '}' 
-/.$putCase consumeMethodBody(); $break ./
+      case 249 : // System.out.println("SwitchLabels ::= SwitchLabels SwitchLabel");
+        consumeSwitchLabels();
+        break;
 
-NestedMethod ::= $empty
-/.$putCase consumeNestedMethod(); $break ./
+      case 250 : // System.out.println("SwitchLabel ::= case ConstantExpression COLON");
+        consumeCaseLabel();
+        break;
 
---18.8.4 Productions from 8.5: Static Initializers
+      case 251 : // System.out.println("SwitchLabel ::= default COLON");
+        consumeDefaultLabel();
+        break;
 
-StaticInitializer ::=  StaticOnly Block
-/.$putCase consumeStaticInitializer(); $break./
+      case 252 : // System.out.println("WhileStatement ::= while LPAREN Expression RPAREN Statement");
+        consumeStatementWhile();
+        break;
 
-StaticOnly ::= 'static'
-/.$putCase consumeStaticOnly(); $break ./
+      case 253 : // System.out.println("WhileStatementNoShortIf ::= while LPAREN Expression RPAREN StatementNoShortIf");
+        consumeStatementWhile();
+        break;
 
---18.8.5 Productions from 8.6: Constructor Declarations
---ConstructorModifier ::=
---      'public'
---    | 'protected'
---    | 'private'
---
---
-ConstructorDeclaration ::= ConstructorHeader ConstructorBody
-/.$putCase consumeConstructorDeclaration() ; $break ./ 
+      case 254 : // System.out.println("DoStatement ::= do Statement while LPAREN Expression RPAREN SEMICOLON");
+        consumeStatementDo();
+        break;
 
--- These rules are added to be able to parse constructors with no body
-ConstructorDeclaration ::= ConstructorHeader ';'
-/.$putCase consumeInvalidConstructorDeclaration() ; $break ./ 
+      case 255 : // System.out.println("ForStatement ::= for LPAREN ForInitopt SEMICOLON Expressionopt SEMICOLON...");
+        consumeStatementFor();
+        break;
 
--- the rules ExplicitConstructorInvocationopt has been expanded
--- in the rule below in order to make the grammar lalr(1).
--- ConstructorBody ::= '{' ExplicitConstructorInvocationopt BlockStatementsopt '}'
--- Other inlining has occured into the next rule too....
+      case 256 : // System.out.println("ForStatementNoShortIf ::= for LPAREN ForInitopt SEMICOLON Expressionopt SEMICOLON");
+        consumeStatementFor();
+        break;
 
-ConstructorBody ::= NestedMethod  '{' ConstructorBlockStatementsopt '}'
-/.$putCase consumeConstructorBody(); $break ./
+      case 257 : // System.out.println("ForInit ::= StatementExpressionList");
+        consumeForInit();
+        break;
 
-ConstructorBlockStatementsopt -> BlockStatementsopt
+      case 261 : // System.out.println("StatementExpressionList ::= StatementExpressionList COMMA StatementExpression");
+        consumeStatementExpressionList();
+        break;
 
-ConstructorBlockStatementsopt -> ExplicitConstructorInvocation
+      case 262 : // System.out.println("AssertStatement ::= assert Expression SEMICOLON");
+        consumeSimpleAssertStatement();
+        break;
 
-ConstructorBlockStatementsopt ::= ExplicitConstructorInvocation BlockStatements
-/.$putCase  consumeConstructorBlockStatements(); $break ./
+      case 263 : // System.out.println("AssertStatement ::= assert Expression COLON Expression SEMICOLON");
+        consumeAssertStatement();
+        break;
 
-ExplicitConstructorInvocation ::= 'this' '(' ArgumentListopt ')' ';'
-/.$putCase consumeExplicitConstructorInvocation(0,ExplicitConstructorCall.This); $break ./
+      case 264 : // System.out.println("BreakStatement ::= break SEMICOLON");
+        consumeStatementBreak();
+        break;
 
-ExplicitConstructorInvocation ::= 'super' '(' ArgumentListopt ')' ';'
-/.$putCase consumeExplicitConstructorInvocation(0,ExplicitConstructorCall.Super); $break ./
+      case 265 : // System.out.println("BreakStatement ::= break Identifier SEMICOLON");
+        consumeStatementBreakWithLabel();
+        break;
 
---1.1 feature
-ExplicitConstructorInvocation ::= Primary '.' 'super' '(' ArgumentListopt ')' ';'
-/.$putCase consumeExplicitConstructorInvocation(1, ExplicitConstructorCall.Super); $break ./
+      case 266 : // System.out.println("ContinueStatement ::= continue SEMICOLON");
+        consumeStatementContinue();
+        break;
 
---1.1 feature
-ExplicitConstructorInvocation ::= Name '.' 'super' '(' ArgumentListopt ')' ';'
-/.$putCase consumeExplicitConstructorInvocation(2, ExplicitConstructorCall.Super); $break ./
+      case 267 : // System.out.println("ContinueStatement ::= continue Identifier SEMICOLON");
+        consumeStatementContinueWithLabel();
+        break;
 
---1.1 feature
-ExplicitConstructorInvocation ::= Primary '.' 'this' '(' ArgumentListopt ')' ';'
-/.$putCase consumeExplicitConstructorInvocation(1, ExplicitConstructorCall.This); $break ./
+      case 268 : // System.out.println("ReturnStatement ::= return Expressionopt SEMICOLON");
+        consumeStatementReturn();
+        break;
 
---1.1 feature
-ExplicitConstructorInvocation ::= Name '.' 'this' '(' ArgumentListopt ')' ';'
-/.$putCase consumeExplicitConstructorInvocation(2, ExplicitConstructorCall.This); $break ./
+      case 269 : // System.out.println("ThrowStatement ::= throw Expression SEMICOLON");
+        consumeStatementThrow();
 
---18.9 Productions from 9: Interface Declarations
+        break;
 
---18.9.1 Productions from 9.1: Interface Declarations
---InterfaceModifier ::=
---      'public'
---    | 'abstract'
---
-InterfaceDeclaration ::= InterfaceHeader InterfaceBody
-/.$putCase consumeInterfaceDeclaration(); $break ./
+      case 270 : // System.out.println("SynchronizedStatement ::= OnlySynchronized LPAREN Expression RPAREN Block");
+        consumeStatementSynchronized();
+        break;
 
-InterfaceHeader ::= InterfaceHeaderName InterfaceHeaderExtendsopt
-/.$putCase consumeInterfaceHeader(); $break ./
+      case 271 : // System.out.println("OnlySynchronized ::= synchronized");
+        consumeOnlySynchronized();
+        break;
 
-InterfaceHeaderName ::= Modifiersopt 'interface' 'Identifier'
-/.$putCase consumeInterfaceHeaderName(); $break ./
+      case 272 : // System.out.println("TryStatement ::= try Block Catches");
+        consumeStatementTry(false);
+        break;
 
--- This rule will be used to accept inner local interface and then report a relevant error message
-InvalidInterfaceDeclaration -> InterfaceHeader InterfaceBody
+      case 273 : // System.out.println("TryStatement ::= try Block Catchesopt Finally");
+        consumeStatementTry(true);
+        break;
 
-InterfaceHeaderExtends ::= 'extends' InterfaceTypeList
-/.$putCase consumeInterfaceHeaderExtends(); $break ./
+      case 275 : // System.out.println("Catches ::= Catches CatchClause");
+        consumeCatches();
+        break;
 
-InterfaceBody ::= '{' InterfaceMemberDeclarationsopt '}' 
-
-InterfaceMemberDeclarations -> InterfaceMemberDeclaration
-InterfaceMemberDeclarations ::= InterfaceMemberDeclarations InterfaceMemberDeclaration
-/.$putCase consumeInterfaceMemberDeclarations(); $break ./
-
---same as for class members
-InterfaceMemberDeclaration ::= ';'
-/.$putCase consumeEmptyInterfaceMemberDeclaration(); $break ./
+      case 276 : // System.out.println("CatchClause ::= catch LPAREN FormalParameter RPAREN Block");
+        consumeStatementCatch();
+        break;
 
--- This rule is added to be able to parse non abstract method inside interface and then report a relevent error message
-InvalidMethodDeclaration -> MethodHeader MethodBody
+      case 278 : // System.out.println("PushLPAREN ::= LPAREN");
+        consumeLeftParen();
+        break;
 
-InterfaceMemberDeclaration -> ConstantDeclaration
-InterfaceMemberDeclaration ::= InvalidMethodDeclaration
-/.$putCase ignoreMethodBody(); $break ./
-
--- These rules are added to be able to parse constructors inside interface and then report a relevent error message
-InvalidConstructorDeclaration ::= ConstructorHeader ConstructorBody
-/.$putCase ignoreInvalidConstructorDeclaration(true);  $break ./
-
-InvalidConstructorDeclaration ::= ConstructorHeader ';'
-/.$putCase ignoreInvalidConstructorDeclaration(false);  $break ./
-
-InterfaceMemberDeclaration -> AbstractMethodDeclaration
-InterfaceMemberDeclaration -> InvalidConstructorDeclaration
---1.1 feature
-InterfaceMemberDeclaration -> ClassDeclaration
---1.1 feature
-InterfaceMemberDeclaration -> InterfaceDeclaration
-
-ConstantDeclaration -> FieldDeclaration
-
-ArrayInitializer ::= '{' ,opt '}'
-/.$putCase consumeEmptyArrayInitializer(); $break ./
-ArrayInitializer ::= '{' VariableInitializers '}'
-/.$putCase consumeArrayInitializer(); $break ./
-ArrayInitializer ::= '{' VariableInitializers , '}'
-/.$putCase consumeArrayInitializer(); $break ./
+      case 279 : // System.out.println("PushRPAREN ::= RPAREN");
+        consumeRightParen();
+        break;
 
-VariableInitializers ::= VariableInitializer
-VariableInitializers ::= VariableInitializers ',' VariableInitializer
-/.$putCase consumeVariableInitializers(); $break ./
+      case 283 : // System.out.println("PrimaryNoNewArray ::= this");
+        consumePrimaryNoNewArrayThis();
+        break;
 
-Block ::= OpenBlock '{' BlockStatementsopt '}'
-/.$putCase consumeBlock(); $break ./
-OpenBlock ::= $empty
-/.$putCase consumeOpenBlock() ; $break ./
-
-BlockStatements -> BlockStatement
-BlockStatements ::= BlockStatements BlockStatement
-/.$putCase consumeBlockStatements() ; $break ./
-
-BlockStatement -> LocalVariableDeclarationStatement
-BlockStatement -> Statement
---1.1 feature
-BlockStatement -> ClassDeclaration
-BlockStatement ::= InvalidInterfaceDeclaration
-/.$putCase ignoreInterfaceDeclaration(); $break ./
-
-LocalVariableDeclarationStatement ::= LocalVariableDeclaration ';'
-/.$putCase consumeLocalVariableDeclarationStatement(); $break ./
-
-LocalVariableDeclaration ::= Type PushModifiers VariableDeclarators
-/.$putCase consumeLocalVariableDeclaration(); $break ./
-
--- 1.1 feature
--- The modifiers part of this rule makes the grammar more permissive. 
--- The only modifier here is final. We put Modifiers to allow multiple modifiers
--- This will require to check the validity of the modifier
-
-LocalVariableDeclaration ::= Modifiers Type PushModifiers VariableDeclarators
-/.$putCase consumeLocalVariableDeclaration(); $break ./
-
-PushModifiers ::= $empty
-/.$putCase consumePushModifiers(); $break ./
-
-Statement -> StatementWithoutTrailingSubstatement
-Statement -> LabeledStatement
-Statement -> IfThenStatement
-Statement -> IfThenElseStatement
-Statement -> WhileStatement
-Statement -> ForStatement
-
-StatementNoShortIf -> StatementWithoutTrailingSubstatement
-StatementNoShortIf -> LabeledStatementNoShortIf
-StatementNoShortIf -> IfThenElseStatementNoShortIf
-StatementNoShortIf -> WhileStatementNoShortIf
-StatementNoShortIf -> ForStatementNoShortIf
+      case 284 : // System.out.println("PrimaryNoNewArray ::= PushLPAREN Expression PushRPAREN");
+        consumePrimaryNoNewArray();
+        break;
 
-StatementWithoutTrailingSubstatement -> AssertStatement
-StatementWithoutTrailingSubstatement -> Block
-StatementWithoutTrailingSubstatement -> EmptyStatement
-StatementWithoutTrailingSubstatement -> ExpressionStatement
-StatementWithoutTrailingSubstatement -> SwitchStatement
-StatementWithoutTrailingSubstatement -> DoStatement
-StatementWithoutTrailingSubstatement -> BreakStatement
-StatementWithoutTrailingSubstatement -> ContinueStatement
-StatementWithoutTrailingSubstatement -> ReturnStatement
-StatementWithoutTrailingSubstatement -> SynchronizedStatement
-StatementWithoutTrailingSubstatement -> ThrowStatement
-StatementWithoutTrailingSubstatement -> TryStatement
-
-EmptyStatement ::= ';'
-/.$putCase consumeEmptyStatement(); $break ./
-
-LabeledStatement ::= 'Identifier' ':' Statement
-/.$putCase consumeStatementLabel() ; $break ./
-
-LabeledStatementNoShortIf ::= 'Identifier' ':' StatementNoShortIf
-/.$putCase consumeStatementLabel() ; $break ./
-
-ExpressionStatement ::= StatementExpression ';'
-/. $putCase consumeExpressionStatement(); $break ./
-
-StatementExpression ::= Assignment
-StatementExpression ::= PreIncrementExpression
-StatementExpression ::= PreDecrementExpression
-StatementExpression ::= PostIncrementExpression
-StatementExpression ::= PostDecrementExpression
-StatementExpression ::= MethodInvocation
-StatementExpression ::= ClassInstanceCreationExpression
-
-IfThenStatement ::=  'if' '(' Expression ')' Statement
-/.$putCase consumeStatementIfNoElse(); $break ./
-
-IfThenElseStatement ::=  'if' '(' Expression ')' StatementNoShortIf 'else' Statement
-/.$putCase consumeStatementIfWithElse(); $break ./
+      case 287 : // System.out.println("PrimaryNoNewArray ::= Name DOT this");
+        consumePrimaryNoNewArrayNameThis();
+        break;
 
-IfThenElseStatementNoShortIf ::=  'if' '(' Expression ')' StatementNoShortIf 'else' StatementNoShortIf
-/.$putCase consumeStatementIfWithElse(); $break ./
+      case 288 : // System.out.println("PrimaryNoNewArray ::= Name DOT super");
+        consumePrimaryNoNewArrayNameSuper();
+        break;
 
-SwitchStatement ::= 'switch' OpenBlock '(' Expression ')' SwitchBlock
-/.$putCase consumeStatementSwitch() ; $break ./
+      case 289 : // System.out.println("PrimaryNoNewArray ::= Name DOT class");
+        consumePrimaryNoNewArrayName();
+        break;
 
-SwitchBlock ::= '{' '}'
-/.$putCase consumeEmptySwitchBlock() ; $break ./
+      case 290 : // System.out.println("PrimaryNoNewArray ::= ArrayType DOT class");
+        consumePrimaryNoNewArrayArrayType();
+        break;
 
-SwitchBlock ::= '{' SwitchBlockStatements '}'
-SwitchBlock ::= '{' SwitchLabels '}'
-SwitchBlock ::= '{' SwitchBlockStatements SwitchLabels '}'
-/.$putCase consumeSwitchBlock() ; $break ./
+      case 291 : // System.out.println("PrimaryNoNewArray ::= PrimitiveType DOT class");
+        consumePrimaryNoNewArrayPrimitiveType();
+        break;
 
-SwitchBlockStatements -> SwitchBlockStatement
-SwitchBlockStatements ::= SwitchBlockStatements SwitchBlockStatement
-/.$putCase consumeSwitchBlockStatements() ; $break ./
+      case 294 : // System.out.println("AllocationHeader ::= new ClassType LPAREN ArgumentListopt RPAREN");
+        consumeAllocationHeader();
+        break;
 
-SwitchBlockStatement ::= SwitchLabels BlockStatements
-/.$putCase consumeSwitchBlockStatement() ; $break ./
+      case 295 : // System.out.println("ClassInstanceCreationExpression ::= new ClassType LPAREN ArgumentListopt RPAREN...");
+        consumeClassInstanceCreationExpression();
+        break;
 
-SwitchLabels -> SwitchLabel
-SwitchLabels ::= SwitchLabels SwitchLabel
-/.$putCase consumeSwitchLabels() ; $break ./
+      case 296 : // System.out.println("ClassInstanceCreationExpression ::= Primary DOT new SimpleName LPAREN...");
+        consumeClassInstanceCreationExpressionQualified();
+        break;
 
-SwitchLabel ::= 'case' ConstantExpression ':'
-/. $putCase consumeCaseLabel(); $break ./
+      case 297 : // System.out.println("ClassInstanceCreationExpression ::= ClassInstanceCreationExpressionName new...");
+        consumeClassInstanceCreationExpressionQualified();
+        break;
 
-SwitchLabel ::= 'default' ':'
-/. $putCase consumeDefaultLabel(); $break ./
+      case 298 : // System.out.println("ClassInstanceCreationExpressionName ::= Name DOT");
+        consumeClassInstanceCreationExpressionName();
+        break;
 
-WhileStatement ::= 'while' '(' Expression ')' Statement
-/.$putCase consumeStatementWhile() ; $break ./
+      case 299 : // System.out.println("ClassBodyopt ::=");
+        consumeClassBodyopt();
+        break;
 
-WhileStatementNoShortIf ::= 'while' '(' Expression ')' StatementNoShortIf
-/.$putCase consumeStatementWhile() ; $break ./
+      case 301 : // System.out.println("EnterAnonymousClassBody ::=");
+        consumeEnterAnonymousClassBody();
+        break;
 
-DoStatement ::= 'do' Statement 'while' '(' Expression ')' ';'
-/.$putCase consumeStatementDo() ; $break ./
+      case 303 : // System.out.println("ArgumentList ::= ArgumentList COMMA Expression");
+        consumeArgumentList();
+        break;
 
-ForStatement ::= 'for' '(' ForInitopt ';' Expressionopt ';' ForUpdateopt ')' Statement
-/.$putCase consumeStatementFor() ; $break ./
-ForStatementNoShortIf ::= 'for' '(' ForInitopt ';' Expressionopt ';' ForUpdateopt ')' StatementNoShortIf
-/.$putCase consumeStatementFor() ; $break ./
+      case 304 : // System.out.println("ArrayCreationExpression ::= new PrimitiveType DimWithOrWithOutExprs...");
+        consumeArrayCreationExpression();
+        break;
 
---the minus one allows to avoid a stack-to-stack transfer
-ForInit ::= StatementExpressionList
-/.$putCase consumeForInit() ; $break ./
-ForInit -> LocalVariableDeclaration
+      case 305 : // System.out.println("ArrayCreationExpression ::= new ClassOrInterfaceType DimWithOrWithOutExprs...");
+        consumeArrayCreationExpression();
+        break;
 
-ForUpdate -> StatementExpressionList
+      case 307 : // System.out.println("DimWithOrWithOutExprs ::= DimWithOrWithOutExprs DimWithOrWithOutExpr");
+        consumeDimWithOrWithOutExprs();
+        break;
 
-StatementExpressionList -> StatementExpression
-StatementExpressionList ::= StatementExpressionList ',' StatementExpression
-/.$putCase consumeStatementExpressionList() ; $break ./
+      case 309 : // System.out.println("DimWithOrWithOutExpr ::= LBRACKET RBRACKET");
+        consumeDimWithOrWithOutExpr();
+        break;
 
--- 1.4 feature
-AssertStatement ::= 'assert' Expression ';'
-/.$putCase consumeSimpleAssertStatement() ; $break ./
+      case 310 : // System.out.println("Dims ::= DimsLoop");
+        consumeDims();
+        break;
 
-AssertStatement ::= 'assert' Expression ':' Expression ';'
-/.$putCase consumeAssertStatement() ; $break ./
-          
-BreakStatement ::= 'break' ';'
-/.$putCase consumeStatementBreak() ; $break ./
+      case 313 : // System.out.println("OneDimLoop ::= LBRACKET RBRACKET");
+        consumeOneDimLoop();
+        break;
 
-BreakStatement ::= 'break' Identifier ';'
-/.$putCase consumeStatementBreakWithLabel() ; $break ./
+      case 314 : // System.out.println("FieldAccess ::= Primary DOT Identifier");
+        consumeFieldAccess(false);
+        break;
 
-ContinueStatement ::= 'continue' ';'
-/.$putCase consumeStatementContinue() ; $break ./
+      case 315 : // System.out.println("FieldAccess ::= super DOT Identifier");
+        consumeFieldAccess(true);
+        break;
 
-ContinueStatement ::= 'continue' Identifier ';'
-/.$putCase consumeStatementContinueWithLabel() ; $break ./
+      case 316 : // System.out.println("MethodInvocation ::= Name LPAREN ArgumentListopt RPAREN");
+        consumeMethodInvocationName();
+        break;
 
-ReturnStatement ::= 'return' Expressionopt ';'
-/.$putCase consumeStatementReturn() ; $break ./
+      case 317 : // System.out.println("MethodInvocation ::= Primary DOT Identifier LPAREN ArgumentListopt RPAREN");
+        consumeMethodInvocationPrimary();
+        break;
 
-ThrowStatement ::= 'throw' Expression ';'
-/.$putCase consumeStatementThrow();
-$break ./
+      case 318 : // System.out.println("MethodInvocation ::= super DOT Identifier LPAREN ArgumentListopt RPAREN");
+        consumeMethodInvocationSuper();
+        break;
 
-SynchronizedStatement ::= OnlySynchronized '(' Expression ')'    Block
-/.$putCase consumeStatementSynchronized(); $break ./
-OnlySynchronized ::= 'synchronized'
-/.$putCase consumeOnlySynchronized(); $break ./
+      case 319 : // System.out.println("ArrayAccess ::= Name LBRACKET Expression RBRACKET");
+        consumeArrayAccess(true);
+        break;
 
+      case 320 : // System.out.println("ArrayAccess ::= PrimaryNoNewArray LBRACKET Expression RBRACKET");
+        consumeArrayAccess(false);
+        break;
 
-TryStatement ::= 'try'    Block Catches
-/.$putCase consumeStatementTry(false); $break ./
-TryStatement ::= 'try'    Block Catchesopt Finally
-/.$putCase consumeStatementTry(true); $break ./
+      case 322 : // System.out.println("PostfixExpression ::= Name");
+        consumePostfixExpression();
+        break;
 
-Catches -> CatchClause
-Catches ::= Catches CatchClause
-/.$putCase consumeCatches(); $break ./
+      case 325 : // System.out.println("PostIncrementExpression ::= PostfixExpression PLUS_PLUS");
+        consumeUnaryExpression(OperatorExpression.PLUS, true);
+        break;
 
-CatchClause ::= 'catch' '(' FormalParameter ')'    Block
-/.$putCase consumeStatementCatch() ; $break ./
+      case 326 : // System.out.println("PostDecrementExpression ::= PostfixExpression MINUS_MINUS");
+        consumeUnaryExpression(OperatorExpression.MINUS, true);
+        break;
 
-Finally ::= 'finally'    Block
+      case 327 : // System.out.println("PushPosition ::=");
+        consumePushPosition();
+        break;
 
---18.12 Productions from 14: Expressions
+      case 330 : // System.out.println("UnaryExpression ::= PLUS PushPosition UnaryExpression");
+        consumeUnaryExpression(OperatorExpression.PLUS);
+        break;
 
---for source positionning purpose
-PushLPAREN ::= '('
-/.$putCase consumeLeftParen(); $break ./
-PushRPAREN ::= ')'
-/.$putCase consumeRightParen(); $break ./
+      case 331 : // System.out.println("UnaryExpression ::= MINUS PushPosition UnaryExpression");
+        consumeUnaryExpression(OperatorExpression.MINUS);
+        break;
 
-Primary -> PrimaryNoNewArray
-Primary -> ArrayCreationExpression
+      case 333 : // System.out.println("PreIncrementExpression ::= PLUS_PLUS PushPosition UnaryExpression");
+        consumeUnaryExpression(OperatorExpression.PLUS, false);
+        break;
 
-PrimaryNoNewArray -> Literal
-PrimaryNoNewArray ::= 'this'
-/.$putCase consumePrimaryNoNewArrayThis(); $break ./
+      case 334 : // System.out.println("PreDecrementExpression ::= MINUS_MINUS PushPosition UnaryExpression");
+        consumeUnaryExpression(OperatorExpression.MINUS, false);
+        break;
 
-PrimaryNoNewArray ::=  PushLPAREN Expression PushRPAREN 
-/.$putCase consumePrimaryNoNewArray(); $break ./
+      case 336 : // System.out.println("UnaryExpressionNotPlusMinus ::= TWIDDLE PushPosition UnaryExpression");
+        consumeUnaryExpression(OperatorExpression.TWIDDLE);
+        break;
 
-PrimaryNoNewArray -> ClassInstanceCreationExpression
-PrimaryNoNewArray -> FieldAccess
---1.1 feature
-PrimaryNoNewArray ::= Name '.' 'this'
-/.$putCase consumePrimaryNoNewArrayNameThis(); $break ./
-PrimaryNoNewArray ::= Name '.' 'super'
-/.$putCase consumePrimaryNoNewArrayNameSuper(); $break ./
+      case 337 : // System.out.println("UnaryExpressionNotPlusMinus ::= NOT PushPosition UnaryExpression");
+        consumeUnaryExpression(OperatorExpression.NOT);
+        break;
 
---1.1 feature
---PrimaryNoNewArray ::= Type '.' 'class'   
---inline Type in the previous rule in order to make the grammar LL1 instead 
--- of LL2. The result is the 3 next rules.
-PrimaryNoNewArray ::= Name '.' 'class'
-/.$putCase consumePrimaryNoNewArrayName(); $break ./
+      case 339 : // System.out.println("CastExpression ::= PushLPAREN PrimitiveType Dimsopt PushRPAREN UnaryExpression");
+        consumeCastExpression();
+        break;
 
-PrimaryNoNewArray ::= ArrayType '.' 'class'
-/.$putCase consumePrimaryNoNewArrayArrayType(); $break ./
+      case 340 : // System.out.println("CastExpression ::= PushLPAREN Name Dims PushRPAREN UnaryExpressionNotPlusMinus");
+        consumeCastExpression();
+        break;
 
-PrimaryNoNewArray ::= PrimitiveType '.' 'class'
-/.$putCase consumePrimaryNoNewArrayPrimitiveType(); $break ./
+      case 341 : // System.out.println("CastExpression ::= PushLPAREN Expression PushRPAREN UnaryExpressionNotPlusMinus");
+        consumeCastExpressionLL1();
+        break;
 
-PrimaryNoNewArray -> MethodInvocation
-PrimaryNoNewArray -> ArrayAccess
+      case 343 : // System.out.println("MultiplicativeExpression ::= MultiplicativeExpression MULTIPLY UnaryExpression");
+        consumeBinaryExpression(OperatorExpression.MULTIPLY);
+        break;
 
---1.1 feature
---
--- In Java 1.0 a ClassBody could not appear at all in a
--- ClassInstanceCreationExpression.
---
+      case 344 : // System.out.println("MultiplicativeExpression ::= MultiplicativeExpression DIVIDE UnaryExpression");
+        consumeBinaryExpression(OperatorExpression.DIVIDE);
+        break;
 
-AllocationHeader ::= 'new' ClassType '(' ArgumentListopt ')'
-/.$putCase consumeAllocationHeader(); $break ./
+      case 345 : // System.out.println("MultiplicativeExpression ::= MultiplicativeExpression REMAINDER UnaryExpression");
+        consumeBinaryExpression(OperatorExpression.REMAINDER);
+        break;
 
-ClassInstanceCreationExpression ::= 'new' ClassType '(' ArgumentListopt ')' ClassBodyopt
-/.$putCase consumeClassInstanceCreationExpression(); $break ./
---1.1 feature
+      case 347 : // System.out.println("AdditiveExpression ::= AdditiveExpression PLUS MultiplicativeExpression");
+        consumeBinaryExpression(OperatorExpression.PLUS);
+        break;
 
-ClassInstanceCreationExpression ::= Primary '.' 'new' SimpleName '(' ArgumentListopt ')' ClassBodyopt
-/.$putCase consumeClassInstanceCreationExpressionQualified() ; $break ./
+      case 348 : // System.out.println("AdditiveExpression ::= AdditiveExpression MINUS MultiplicativeExpression");
+        consumeBinaryExpression(OperatorExpression.MINUS);
+        break;
 
---1.1 feature
-ClassInstanceCreationExpression ::= ClassInstanceCreationExpressionName 'new' SimpleName '(' ArgumentListopt ')' ClassBodyopt
-/.$putCase consumeClassInstanceCreationExpressionQualified() ; $break ./
+      case 350 : // System.out.println("ShiftExpression ::= ShiftExpression LEFT_SHIFT AdditiveExpression");
+        consumeBinaryExpression(OperatorExpression.LEFT_SHIFT);
+        break;
 
-ClassInstanceCreationExpressionName ::= Name '.'
-/.$putCase consumeClassInstanceCreationExpressionName() ; $break ./
-
-ClassBodyopt ::= $empty --test made using null as contents
-/.$putCase consumeClassBodyopt(); $break ./
-ClassBodyopt ::= EnterAnonymousClassBody ClassBody
-
-EnterAnonymousClassBody ::= $empty
-/.$putCase consumeEnterAnonymousClassBody(); $break ./
-
-ArgumentList ::= Expression
-ArgumentList ::= ArgumentList ',' Expression
-/.$putCase consumeArgumentList(); $break ./
-
---Thess rules are re-written in order to be ll1 
---ArrayCreationExpression ::= 'new' ArrayType ArrayInitializer
---ArrayCreationExpression ::= 'new' PrimitiveType DimExprs Dimsopt 
---ArrayCreationExpression ::= 'new' ClassOrInterfaceType DimExprs Dimsopt
---DimExprs ::= DimExpr
---DimExprs ::= DimExprs DimExpr
-
-ArrayCreationExpression ::= 'new' PrimitiveType DimWithOrWithOutExprs ArrayInitializeropt
-/.$putCase consumeArrayCreationExpression(); $break ./
-ArrayCreationExpression ::= 'new' ClassOrInterfaceType DimWithOrWithOutExprs ArrayInitializeropt
-/.$putCase consumeArrayCreationExpression(); $break ./
-
-DimWithOrWithOutExprs ::= DimWithOrWithOutExpr
-DimWithOrWithOutExprs ::= DimWithOrWithOutExprs DimWithOrWithOutExpr
-/.$putCase consumeDimWithOrWithOutExprs(); $break ./
-
-DimWithOrWithOutExpr ::= '[' Expression ']'
-DimWithOrWithOutExpr ::= '[' ']'
-/. $putCase consumeDimWithOrWithOutExpr(); $break ./
--- -----------------------------------------------
-
-Dims ::= DimsLoop
-/. $putCase consumeDims(); $break ./
-DimsLoop -> OneDimLoop
-DimsLoop ::= DimsLoop OneDimLoop
-OneDimLoop ::= '[' ']'
-/. $putCase consumeOneDimLoop(); $break ./
-
-FieldAccess ::= Primary '.' 'Identifier'
-/.$putCase consumeFieldAccess(false); $break ./
-
-FieldAccess ::= 'super' '.' 'Identifier'
-/.$putCase consumeFieldAccess(true); $break ./
-
-MethodInvocation ::= Name '(' ArgumentListopt ')'
-/.$putCase consumeMethodInvocationName(); $break ./
-
-MethodInvocation ::= Primary '.' 'Identifier' '(' ArgumentListopt ')'
-/.$putCase consumeMethodInvocationPrimary(); $break ./
-
-MethodInvocation ::= 'super' '.' 'Identifier' '(' ArgumentListopt ')'
-/.$putCase consumeMethodInvocationSuper(); $break ./
-
-ArrayAccess ::= Name '[' Expression ']'
-/.$putCase consumeArrayAccess(true); $break ./
-ArrayAccess ::= PrimaryNoNewArray '[' Expression ']'
-/.$putCase consumeArrayAccess(false); $break ./
-
-PostfixExpression -> Primary
-PostfixExpression ::= Name
-/.$putCase consumePostfixExpression(); $break ./
-PostfixExpression -> PostIncrementExpression
-PostfixExpression -> PostDecrementExpression
-
-PostIncrementExpression ::= PostfixExpression '++'
-/.$putCase consumeUnaryExpression(OperatorExpression.PLUS,true); $break ./
-
-PostDecrementExpression ::= PostfixExpression '--'
-/.$putCase consumeUnaryExpression(OperatorExpression.MINUS,true); $break ./
-
---for source managment purpose
-PushPosition ::= $empty
- /.$putCase consumePushPosition(); $break ./
-
-UnaryExpression -> PreIncrementExpression
-UnaryExpression -> PreDecrementExpression
-UnaryExpression ::= '+' PushPosition UnaryExpression
-/.$putCase consumeUnaryExpression(OperatorExpression.PLUS); $break ./
-UnaryExpression ::= '-' PushPosition UnaryExpression
-/.$putCase consumeUnaryExpression(OperatorExpression.MINUS); $break ./
-UnaryExpression -> UnaryExpressionNotPlusMinus
-
-PreIncrementExpression ::= '++' PushPosition UnaryExpression
-/.$putCase consumeUnaryExpression(OperatorExpression.PLUS,false); $break ./
-
-PreDecrementExpression ::= '--' PushPosition UnaryExpression
-/.$putCase consumeUnaryExpression(OperatorExpression.MINUS,false); $break ./
-
-UnaryExpressionNotPlusMinus -> PostfixExpression
-UnaryExpressionNotPlusMinus ::= '~' PushPosition UnaryExpression
-/.$putCase consumeUnaryExpression(OperatorExpression.TWIDDLE); $break ./
-UnaryExpressionNotPlusMinus ::= '!' PushPosition UnaryExpression
-/.$putCase consumeUnaryExpression(OperatorExpression.NOT); $break ./
-UnaryExpressionNotPlusMinus -> CastExpression
-
-CastExpression ::= PushLPAREN PrimitiveType Dimsopt PushRPAREN UnaryExpression
-/.$putCase consumeCastExpression(); $break ./
- CastExpression ::= PushLPAREN Name Dims PushRPAREN UnaryExpressionNotPlusMinus
-/.$putCase consumeCastExpression(); $break ./
--- Expression is here only in order to make the grammar LL1
-CastExpression ::= PushLPAREN Expression PushRPAREN UnaryExpressionNotPlusMinus
-/.$putCase consumeCastExpressionLL1(); $break ./
-
-MultiplicativeExpression -> UnaryExpression
-MultiplicativeExpression ::= MultiplicativeExpression '*' UnaryExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.MULTIPLY); $break ./
-MultiplicativeExpression ::= MultiplicativeExpression '/' UnaryExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.DIVIDE); $break ./
-MultiplicativeExpression ::= MultiplicativeExpression '%' UnaryExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.REMAINDER); $break ./
-
-AdditiveExpression -> MultiplicativeExpression
-AdditiveExpression ::= AdditiveExpression '+' MultiplicativeExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.PLUS); $break ./
-AdditiveExpression ::= AdditiveExpression '-' MultiplicativeExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.MINUS); $break ./
-
-ShiftExpression -> AdditiveExpression
-ShiftExpression ::= ShiftExpression '<<'  AdditiveExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.LEFT_SHIFT); $break ./
-ShiftExpression ::= ShiftExpression '>>'  AdditiveExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.RIGHT_SHIFT); $break ./
-ShiftExpression ::= ShiftExpression '>>>' AdditiveExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.UNSIGNED_RIGHT_SHIFT); $break ./
-
-RelationalExpression -> ShiftExpression
-RelationalExpression ::= RelationalExpression '<'  ShiftExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.LESS); $break ./
-RelationalExpression ::= RelationalExpression '>'  ShiftExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.GREATER); $break ./
-RelationalExpression ::= RelationalExpression '<=' ShiftExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.LESS_EQUAL); $break ./
-RelationalExpression ::= RelationalExpression '>=' ShiftExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.GREATER_EQUAL); $break ./
-RelationalExpression ::= RelationalExpression 'instanceof' ReferenceType
-/.$putCase consumeInstanceOfExpression(OperatorExpression.INSTANCEOF); $break ./
-
-EqualityExpression -> RelationalExpression
-EqualityExpression ::= EqualityExpression '==' RelationalExpression
-/.$putCase consumeEqualityExpression(OperatorExpression.EQUAL_EQUAL); $break ./
-EqualityExpression ::= EqualityExpression '!=' RelationalExpression
-/.$putCase consumeEqualityExpression(OperatorExpression.NOT_EQUAL); $break ./
-
-AndExpression -> EqualityExpression
-AndExpression ::= AndExpression '&' EqualityExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.AND); $break ./
-
-ExclusiveOrExpression -> AndExpression
-ExclusiveOrExpression ::= ExclusiveOrExpression '^' AndExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.XOR); $break ./
-
-InclusiveOrExpression -> ExclusiveOrExpression
-InclusiveOrExpression ::= InclusiveOrExpression '|' ExclusiveOrExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.OR); $break ./
-
-ConditionalAndExpression -> InclusiveOrExpression
-ConditionalAndExpression ::= ConditionalAndExpression '&&' InclusiveOrExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.AND_AND); $break ./
-
-ConditionalOrExpression -> ConditionalAndExpression
-ConditionalOrExpression ::= ConditionalOrExpression '||' ConditionalAndExpression
-/.$putCase consumeBinaryExpression(OperatorExpression.OR_OR); $break ./
-
-ConditionalExpression -> ConditionalOrExpression
-ConditionalExpression ::= ConditionalOrExpression '?' Expression ':' ConditionalExpression
-/.$putCase consumeConditionalExpression(OperatorExpression.QUESTIONCOLON) ; $break ./
-
-AssignmentExpression -> ConditionalExpression
-AssignmentExpression -> Assignment
-
-Assignment ::= LeftHandSide AssignmentOperator AssignmentExpression
-/.$putCase consumeAssignment(); $break ./
-
--- this rule is added to parse an array initializer in a assigment and then report a syntax error knowing the exact senario
-InvalidArrayInitializerAssignement ::= LeftHandSide AssignmentOperator ArrayInitializer
-Assignment ::= InvalidArrayInitializerAssignement
-/.$putcase ignoreExpressionAssignment();$break ./
-
-LeftHandSide ::= Name
-/.$putCase consumeLeftHandSide(); $break ./
-LeftHandSide -> FieldAccess
-LeftHandSide -> ArrayAccess
-
-AssignmentOperator ::= '='
-/.$putCase consumeAssignmentOperator(EQUAL); $break ./
-AssignmentOperator ::= '*='
-/.$putCase consumeAssignmentOperator(MULTIPLY); $break ./
-AssignmentOperator ::= '/='
-/.$putCase consumeAssignmentOperator(DIVIDE); $break ./
-AssignmentOperator ::= '%='
-/.$putCase consumeAssignmentOperator(REMAINDER); $break ./
-AssignmentOperator ::= '+='
-/.$putCase consumeAssignmentOperator(PLUS); $break ./
-AssignmentOperator ::= '-='
-/.$putCase consumeAssignmentOperator(MINUS); $break ./
-AssignmentOperator ::= '<<='
-/.$putCase consumeAssignmentOperator(LEFT_SHIFT); $break ./
-AssignmentOperator ::= '>>='
-/.$putCase consumeAssignmentOperator(RIGHT_SHIFT); $break ./
-AssignmentOperator ::= '>>>='
-/.$putCase consumeAssignmentOperator(UNSIGNED_RIGHT_SHIFT); $break ./
-AssignmentOperator ::= '&='
-/.$putCase consumeAssignmentOperator(AND); $break ./
-AssignmentOperator ::= '^='
-/.$putCase consumeAssignmentOperator(XOR); $break ./
-AssignmentOperator ::= '|='
-/.$putCase consumeAssignmentOperator(OR); $break ./
-
-Expression -> AssignmentExpression
-
-ConstantExpression -> Expression
-
--- The following rules are for optional nonterminals.
---
-
-PackageDeclarationopt -> $empty 
-PackageDeclarationopt -> PackageDeclaration
-
-ClassHeaderExtendsopt ::= $empty
-ClassHeaderExtendsopt -> ClassHeaderExtends
-
-Expressionopt ::= $empty
-/.$putCase consumeEmptyExpression(); $break ./
-Expressionopt -> Expression
-
-
----------------------------------------------------------------------------------------
---
--- The rules below are for optional terminal symbols.  An optional comma,
--- is only used in the context of an array initializer - It is a
--- "syntactic sugar" that otherwise serves no other purpose. By contrast,
--- an optional identifier is used in the definition of a break and 
--- continue statement. When the identifier does not appear, a NULL
--- is produced. When the identifier is present, the user should use the
--- corresponding TOKEN(i) method. See break statement as an example.
---
----------------------------------------------------------------------------------------
-
-,opt -> $empty
-,opt -> ,
-
-ImportDeclarationsopt ::= $empty
-/.$putCase consumeEmptyImportDeclarationsopt(); $break ./
-ImportDeclarationsopt ::= ImportDeclarations
-/.$putCase consumeImportDeclarationsopt(); $break ./
-
-
-TypeDeclarationsopt ::= $empty
-/.$putCase consumeEmptyTypeDeclarationsopt(); $break ./
-TypeDeclarationsopt ::= TypeDeclarations
-/.$putCase consumeTypeDeclarationsopt(); $break ./
-
-ClassBodyDeclarationsopt ::= $empty
-/.$putCase consumeEmptyClassBodyDeclarationsopt(); $break ./
-ClassBodyDeclarationsopt ::= NestedType ClassBodyDeclarations
-/.$putCase consumeClassBodyDeclarationsopt(); $break ./
-
-Modifiersopt ::= $empty 
-/. $putCase consumeDefaultModifiers(); $break ./
-Modifiersopt ::= Modifiers 
-/.$putCase consumeModifiers(); $break ./ 
-
-BlockStatementsopt ::= $empty
-/.$putCase consumeEmptyBlockStatementsopt(); $break ./
-BlockStatementsopt -> BlockStatements
-
-Dimsopt ::= $empty
-/. $putCase consumeEmptyDimsopt(); $break ./
-Dimsopt -> Dims
-
-ArgumentListopt ::= $empty
-/. $putCase consumeEmptyArgumentListopt(); $break ./
-ArgumentListopt -> ArgumentList
-
-MethodHeaderThrowsClauseopt ::= $empty
-MethodHeaderThrowsClauseopt -> MethodHeaderThrowsClause
-   
-FormalParameterListopt ::= $empty
-/.$putcase consumeFormalParameterListopt(); $break ./
-FormalParameterListopt -> FormalParameterList
-
-ClassHeaderImplementsopt ::= $empty
-ClassHeaderImplementsopt -> ClassHeaderImplements
-
-InterfaceMemberDeclarationsopt ::= $empty
-/. $putCase consumeEmptyInterfaceMemberDeclarationsopt(); $break ./
-InterfaceMemberDeclarationsopt ::= NestedType InterfaceMemberDeclarations
-/. $putCase consumeInterfaceMemberDeclarationsopt(); $break ./
-
-NestedType ::= $empty 
-/.$putCase consumeNestedType(); $break./
-
-ForInitopt ::= $empty
-/. $putCase consumeEmptyForInitopt(); $break ./
-ForInitopt -> ForInit
-
-ForUpdateopt ::= $empty
-/. $putCase consumeEmptyForUpdateopt(); $break ./
- ForUpdateopt -> ForUpdate
-
-InterfaceHeaderExtendsopt ::= $empty
-InterfaceHeaderExtendsopt -> InterfaceHeaderExtends
-
-Catchesopt ::= $empty
-/. $putCase consumeEmptyCatchesopt(); $break ./
-Catchesopt -> Catches
-
-ArrayInitializeropt ::= $empty
-/. $putCase consumeEmptyArrayInitializeropt(); $break ./
-ArrayInitializeropt -> ArrayInitializer
-
-/.     }
-} ./
-
----------------------------------------------------------------------------------------
-
-$names
-
--- BodyMarker ::= '"class Identifier { ... MethodHeader "'
-
--- void ::= 'void'
-
-PLUS_PLUS ::=    '++'   
-MINUS_MINUS ::=    '--'   
-EQUAL_EQUAL ::=    '=='   
-LESS_EQUAL ::=    '<='   
-GREATER_EQUAL ::=    '>='   
-NOT_EQUAL ::=    '!='   
-LEFT_SHIFT ::=    '<<'   
-RIGHT_SHIFT ::=    '>>'   
-UNSIGNED_RIGHT_SHIFT ::=    '>>>'  
-PLUS_EQUAL ::=    '+='   
-MINUS_EQUAL ::=    '-='   
-MULTIPLY_EQUAL ::=    '*='   
-DIVIDE_EQUAL ::=    '/='   
-AND_EQUAL ::=    '&='   
-OR_EQUAL ::=    '|='   
-XOR_EQUAL ::=    '^='   
-REMAINDER_EQUAL ::=    '%='   
-LEFT_SHIFT_EQUAL ::=    '<<='  
-RIGHT_SHIFT_EQUAL ::=    '>>='  
-UNSIGNED_RIGHT_SHIFT_EQUAL ::=    '>>>=' 
-OR_OR ::=    '||'   
-AND_AND ::=    '&&'   
-
-PLUS ::=    '+'    
-MINUS ::=    '-'    
-NOT ::=    '!'    
-REMAINDER ::=    '%'    
-XOR ::=    '^'    
-AND ::=    '&'    
-MULTIPLY ::=    '*'    
-OR ::=    '|'    
-TWIDDLE ::=    '~'    
-DIVIDE ::=    '/'    
-GREATER ::=    '>'    
-LESS ::=    '<'    
-LPAREN ::=    '('    
-RPAREN ::=    ')'    
-LBRACE ::=    '{'    
-RBRACE ::=    '}'    
-LBRACKET ::=    '['    
-RBRACKET ::=    ']'    
-SEMICOLON ::=    ';'    
-QUESTION ::=    '?'    
-COLON ::=    ':'    
-COMMA ::=    ','    
-DOT ::=    '.'    
-EQUAL ::=    '='    
-
-$end
--- need a carriage return after the $end
-*/
-}
-protected void ignoreExpressionAssignment() {
-       // Assignment ::= InvalidArrayInitializerAssignement
-       // encoded operator would be: intStack[intPtr]
-       intPtr--;
-       ArrayInitializer arrayInitializer = (ArrayInitializer) expressionStack[expressionPtr--];
-       expressionLengthPtr -- ;
-       // report a syntax error and abort parsing
-       problemReporter().arrayConstantsOnlyInArrayInitializers(arrayInitializer.sourceStart, arrayInitializer.sourceEnd);      
-}
-protected void ignoreInterfaceDeclaration() {
-       // BlockStatement ::= InvalidInterfaceDeclaration
-       //InterfaceDeclaration ::= Modifiersopt 'interface' 'Identifier' ExtendsInterfacesopt InterfaceHeader InterfaceBody
-
-       // length declarations
-       int length;
-       if ((length = astLengthStack[astLengthPtr--]) != 0) {
-               //there are length declarations
-               //dispatch according to the type of the declarations
-               dispatchDeclarationInto(length);
-       }
-       
-       flushAnnotationsDefinedPriorTo(endStatementPosition);
-
-       // report the problem and continue parsing
-       TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
-       typeDecl.bodyEnd = endStatementPosition;
-       problemReporter().cannotDeclareLocalInterface(typeDecl.name, typeDecl.sourceStart, typeDecl.sourceEnd);
-
-       // mark fields and initializer with local type mark if needed
-       markFieldsWithLocalType(typeDecl);
-
-       // remove the ast node created in interface header
-       astPtr--;       
-       // Don't create an astnode for this inner interface, but have to push
-       // a 0 on the astLengthStack to be consistent with the reduction made
-       // at the end of the method:
-       // public void parse(MethodDeclaration md, CompilationUnitDeclaration unit)
-       pushOnAstLengthStack(0);
-}
-protected void ignoreInvalidConstructorDeclaration(boolean hasBody) {
-       // InvalidConstructorDeclaration ::= ConstructorHeader ConstructorBody ==> true
-       // InvalidConstructorDeclaration ::= ConstructorHeader ';' ==> false
-
-       /*
-       astStack : modifiers arguments throws statements
-       identifierStack : name
-        ==>
-       astStack : MethodDeclaration
-       identifierStack :
-       */
-
-       //must provide a default constructor call when needed
-
-       if (hasBody) {
-               // pop the position of the {  (body of the method) pushed in block decl
-               intPtr--;
-       }
-
-       //statements
-       if (hasBody) {
-               realBlockPtr--;
-       }
-
-       int length;
-       if (hasBody && ((length = astLengthStack[astLengthPtr--]) != 0)) {
-               astPtr -= length;
-       }
-}
-protected void ignoreMethodBody() {
-       // InterfaceMemberDeclaration ::= InvalidMethodDeclaration
-
-       /*
-       astStack : modifiers arguments throws statements
-       identifierStack : type name
-       intStack : dim dim dim
-        ==>
-       astStack : MethodDeclaration
-       identifierStack :
-       intStack : 
-       */
-
-       // pop the position of the {  (body of the method) pushed in block decl
-       intPtr--;
-       // retrieve end position of method declarator
-
-       //statements
-       realBlockPtr--;
-       int length;
-       if ((length = astLengthStack[astLengthPtr--]) != 0) {
-               astPtr -= length;
-       }
-
-       //watch for } that could be given as a unicode ! ( u007D is '}' )
-       MethodDeclaration md = (MethodDeclaration) astStack[astPtr];
-       md.bodyEnd = endPosition;
-       md.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition);
-
-       // report the problem and continue the parsing - narrowing the problem onto the method
-       problemReporter().abstractMethodNeedingNoBody(md);
-}
-public void initialize() {
-       //positionning the parser for a new compilation unit
-       //avoiding stack reallocation and all that....
-       astPtr = -1;
-       astLengthPtr = -1;
-       expressionPtr = -1;
-       expressionLengthPtr = -1;
-       identifierPtr = -1;     
-       identifierLengthPtr     = -1;
-       intPtr = -1;
-       nestedMethod[nestedType = 0] = 0; // need to reset for further reuse
-       variablesCounter[nestedType] = 0;
-       dimensions = 0 ;
-       realBlockPtr = -1;
-       compilationUnit = null;
-       referenceContext = null;
-       endStatementPosition = 0;
-
-       //remove objects from stack too, while the same parser/compiler couple is
-       //re-used between two compilations ....
-       
-       int astLength = astStack.length;
-       if (noAstNodes.length < astLength){
-               noAstNodes = new AstNode[astLength];
-               //System.out.println("Resized AST stacks : "+ astLength);
-               
-       }
-       System.arraycopy(noAstNodes, 0, astStack, 0, astLength);
-
-       int expressionLength = expressionStack.length;
-       if (noExpressions.length < expressionLength){
-               noExpressions = new Expression[expressionLength];
-               //System.out.println("Resized EXPR stacks : "+ expressionLength);
-       }
-       System.arraycopy(noExpressions, 0, expressionStack, 0, expressionLength);
-
-       // reset scanner state
-       scanner.commentPtr = -1;
-       scanner.eofPosition = Integer.MAX_VALUE;
-
-       resetModifiers();
-
-       // recovery
-       lastCheckPoint = -1;
-       currentElement = null;
-       restartRecovery = false;
-       hasReportedError = false;
-       recoveredStaticInitializerStart = 0;
-       lastIgnoredToken = -1;
-       lastErrorEndPosition = -1;
-       listLength = 0;
-}
-public void initializeScanner(){
-       this.scanner = new Scanner(false, false, this.problemReporter.options.getNonExternalizedStringLiteralSeverity() != ProblemSeverities.Ignore , this.assertMode);
-}
-public final static void initTables() throws java.io.IOException {
-
-       final String prefix = FILEPREFIX;
-       int i = 0;
-       lhs = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
-       char[] chars = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
-       check_table = new short[chars.length];
-       for (int c = chars.length; c-- > 0;) {
-               check_table[c] = (short) (chars[c] - 32768);
-       }
-       asb = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
-       asr = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
-       symbol_index = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
-       action = lhs;
-}
-public final void jumpOverMethodBody() {
-       //on diet parsing.....do not buffer method statements
+      case 351 : // System.out.println("ShiftExpression ::= ShiftExpression RIGHT_SHIFT AdditiveExpression");
+        consumeBinaryExpression(OperatorExpression.RIGHT_SHIFT);
+        break;
 
-       //the scanner.diet is reinitialized to false
-       //automatically by the scanner once it has jumped over
-       //the statements
+      case 352 : // System.out.println("ShiftExpression ::= ShiftExpression UNSIGNED_RIGHT_SHIFT AdditiveExpression");
+        consumeBinaryExpression(OperatorExpression.UNSIGNED_RIGHT_SHIFT);
+        break;
 
-       if (diet && (dietInt == 0))
-               scanner.diet = true;
-}
-protected void markCurrentMethodWithLocalType() {
-       if (this.currentElement != null) return; // this is already done in the recovery code
-       for (int i = this.astPtr; i >= 0; i--) {
-               AstNode node = this.astStack[i];
-               if (node instanceof AbstractMethodDeclaration 
-                               || node instanceof TypeDeclaration) { // mark type for now: all fields will be marked when added to this type
-                       node.bits |= AstNode.HasLocalTypeMASK;
-                       return;
-               }
-       }
-       // default to reference context (case of parse method body)
-       if (this.referenceContext instanceof AbstractMethodDeclaration
-                       || this.referenceContext instanceof TypeDeclaration) {
-               ((AstNode)this.referenceContext).bits |= AstNode.HasLocalTypeMASK;
-       }
-}
-protected void markFieldsWithLocalType(TypeDeclaration type) {
-       if (type.fields == null || (type.bits & AstNode.HasLocalTypeMASK) == 0) return;
-       for (int i = 0, length = type.fields.length; i < length; i++) {
-               type.fields[i].bits |= AstNode.HasLocalTypeMASK;
-       }
-}
-/*
- * Move checkpoint location (current implementation is moving it by one token)
- *
- * Answers true if successfully moved checkpoint (i.e. did not attempt to move it
- * beyond end of file).
- */
-protected boolean moveRecoveryCheckpoint() {
-
-       int pos = lastCheckPoint;
-       /* reset scanner, and move checkpoint by one token */
-       scanner.startPosition = pos;
-       scanner.currentPosition = pos;
-       scanner.diet = false; // quit jumping over method bodies
-       
-       /* if about to restart, then no need to shift token */
-       if (restartRecovery){
-               lastIgnoredToken = -1;
-               return true;
-       }
-       
-       /* protect against shifting on an invalid token */
-       lastIgnoredToken = nextIgnoredToken;
-       nextIgnoredToken = -1;
-       do {
-               try {
-                       nextIgnoredToken = scanner.getNextToken();
-                       if(scanner.currentPosition == scanner.startPosition){
-                               scanner.currentPosition++; // on fake completion identifier
-                               nextIgnoredToken = -1;
-                       }
-                       
-               } catch(InvalidInputException e){
-                       pos = scanner.currentPosition;
-               }
-       } while (nextIgnoredToken < 0);
-       
-       if (nextIgnoredToken == TokenNameEOF) { // no more recovery after this point
-               if (currentToken == TokenNameEOF) { // already tried one iteration on EOF
-                       return false;
-               }
-       }
-       lastCheckPoint = scanner.currentPosition;
-       
-       /* reset scanner again to previous checkpoint location*/
-       scanner.startPosition = pos;
-       scanner.currentPosition = pos;
-       scanner.commentPtr = -1;
-
-       return true;
-
-/*
-       The following implementation moves the checkpoint location by one line:
-        
-       int pos = lastCheckPoint;
-       // reset scanner, and move checkpoint by one token
-       scanner.startPosition = pos;
-       scanner.currentPosition = pos;
-       scanner.diet = false; // quit jumping over method bodies
-       
-       // if about to restart, then no need to shift token
-       if (restartRecovery){
-               lastIgnoredToken = -1;
-               return true;
-       }
-       
-       // protect against shifting on an invalid token
-       lastIgnoredToken = nextIgnoredToken;
-       nextIgnoredToken = -1;
-       
-       boolean wasTokenizingWhiteSpace = scanner.tokenizeWhiteSpace;
-       scanner.tokenizeWhiteSpace = true;
-       checkpointMove: 
-               do {
-                       try {
-                               nextIgnoredToken = scanner.getNextToken();
-                               switch(nextIgnoredToken){
-                                       case Scanner.TokenNameWHITESPACE :
-                                               if(scanner.getLineNumber(scanner.startPosition)
-                                                       == scanner.getLineNumber(scanner.currentPosition)){
-                                                       nextIgnoredToken = -1;
-                                                       }
-                                               break;
-                                       case TokenNameSEMICOLON :
-                                       case TokenNameLBRACE :
-                                       case TokenNameRBRACE :
-                                               break;
-                                       case TokenNameIdentifier :
-                                               if(scanner.currentPosition == scanner.startPosition){
-                                                       scanner.currentPosition++; // on fake completion identifier
-                                               }
-                                       default:                                                
-                                               nextIgnoredToken = -1;
-                                               break;
-                                       case TokenNameEOF :
-                                               break checkpointMove;
-                               }
-                       } catch(InvalidInputException e){
-                               pos = scanner.currentPosition;
-                       }
-               } while (nextIgnoredToken < 0);
-       scanner.tokenizeWhiteSpace = wasTokenizingWhiteSpace;
-       
-       if (nextIgnoredToken == TokenNameEOF) { // no more recovery after this point
-               if (currentToken == TokenNameEOF) { // already tried one iteration on EOF
-                       return false;
-               }
-       }
-       lastCheckPoint = scanner.currentPosition;
-       
-       // reset scanner again to previous checkpoint location
-       scanner.startPosition = pos;
-       scanner.currentPosition = pos;
-       scanner.commentPtr = -1;
-
-       return true;
-*/
-}
-protected MessageSend newMessageSend() {
-       // '(' ArgumentListopt ')'
-       // the arguments are on the expression stack
-
-       MessageSend m = new MessageSend();
-       int length;
-       if ((length = expressionLengthStack[expressionLengthPtr--]) != 0) {
-               expressionPtr -= length;
-               System.arraycopy(
-                       expressionStack, 
-                       expressionPtr + 1, 
-                       m.arguments = new Expression[length], 
-                       0, 
-                       length); 
-       };
-       return m;
-}
-protected static int ntAction(int state, int sym) {
-       return action[state + sym];
-}
-private final void optimizedConcatNodeLists() {
-       /*back from a recursive loop. Virtualy group the
-       astNode into an array using astLengthStack*/
-
-       /*
-        * This is a case where you have two sublists into the astStack that you want
-        * to merge in one list. There is no action required on the astStack. The only
-        * thing you need to do is merge the two lengths specified on the astStackLength.
-        * The top two length are for example:
-        * ... p   n
-        * and you want to result in a list like:
-        * ... n+p 
-        * This means that the p could be equals to 0 in case there is no astNode pushed
-        * on the astStack.
-        * Look at the InterfaceMemberDeclarations for an example.
-        * This case optimizes the fact that p == 1.
-        */
-
-       astLengthStack[--astLengthPtr]++;
-}
-protected static int original_state(int state) {
-       return -check(state);
-}
-/*main loop of the automat
-When a rule is reduced, the method consumeRule(int) is called with the number
-of the consumed rule. When a terminal is consumed, the method consumeToken(int) is 
-called in order to remember (when needed) the consumed token */
-// (int)asr[asi(act)]
-// name[symbol_index[currentKind]]
-protected void parse() {
-
-       hasReportedError = false;
-       int act = START_STATE;
-       stateStackTop = -1;
-       currentToken = getFirstToken();
-       ProcessTerminals : for (;;) {
-               try {
-                       stack[++stateStackTop] = act;
-               } catch (IndexOutOfBoundsException e) {
-                       int oldStackLength = stack.length;
-                       int oldStack[] = stack;
-                       stack = new int[oldStackLength + StackIncrement];
-                       System.arraycopy(oldStack, 0, stack, 0, oldStackLength);
-                       stack[stateStackTop] = act;
-               };
-
-               act = tAction(act, currentToken);
-
-               if (act == ERROR_ACTION || restartRecovery) {
-                       int errorPos = scanner.currentPosition;
-                       if (!hasReportedError){
-                               this.reportSyntaxError(ERROR_ACTION, currentToken, stateStackTop);
-                               hasReportedError = true;
-                       }
-                       if (resumeOnSyntaxError()) {
-                               if (act == ERROR_ACTION) lastErrorEndPosition = errorPos;
-                               act = START_STATE;
-                               stateStackTop = -1;
-                               currentToken = getFirstToken();
-                               continue ProcessTerminals;
-                       } else {
-                               act = ERROR_ACTION;
-                       }       break ProcessTerminals;
-               }
-               if (act <= NUM_RULES)
-                       stateStackTop--;
-               else
-                       if (act > ERROR_ACTION) { /* shift-reduce */
-                               consumeToken(currentToken);
-                               if (currentElement != null) this.recoveryTokenCheck();
-                               try{
-                                       currentToken = scanner.getNextToken();
-                               } catch(InvalidInputException e){
-                                       if (!hasReportedError){
-                                               this.problemReporter().scannerError(this, e.getMessage());
-                                               hasReportedError = true;
-                                       }
-                                       lastCheckPoint = scanner.currentPosition;
-                                       restartRecovery = true;
-                               }                                       
-                               act -= ERROR_ACTION;
-                       } else
-                               if (act < ACCEPT_ACTION) { /* shift */
-                                       consumeToken(currentToken);
-                                       if (currentElement != null) this.recoveryTokenCheck();
-                                       try{
-                                               currentToken = scanner.getNextToken();
-                                       } catch(InvalidInputException e){
-                                               if (!hasReportedError){
-                                                       this.problemReporter().scannerError(this, e.getMessage());
-                                                       hasReportedError = true;
-                                               }
-                                               lastCheckPoint = scanner.currentPosition;
-                                               restartRecovery = true;
-                                       }                                       
-                                       continue ProcessTerminals;
-                               } else
-                                       break ProcessTerminals;
-
-               ProcessNonTerminals : do { /* reduce */
-                       consumeRule(act);
-                       stateStackTop -= (rhs[act] - 1);
-                       act = ntAction(stack[stateStackTop], lhs[act]);
-               } while (act <= NUM_RULES);
-       }
-       endParse(act);
-}
-// A P I
-
-public void parse(ConstructorDeclaration cd, CompilationUnitDeclaration unit) {
-       //only parse the method body of cd
-       //fill out its statements
-
-       //convert bugs into parse error
-
-       initialize();
-       goForConstructorBody();
-       nestedMethod[nestedType]++;
-
-       referenceContext = cd;
-       compilationUnit = unit;
-
-       scanner.resetTo(cd.sourceEnd + 1, cd.declarationSourceEnd);
-       try {
-               parse();
-       } catch (AbortCompilation ex) {
-               lastAct = ERROR_ACTION;
-       } finally {
-               nestedMethod[nestedType]--;
-       }
-
-       if (lastAct == ERROR_ACTION) {
-               initialize();
-               return;
-       }
-
-       //statements
-       cd.explicitDeclarations = realBlockStack[realBlockPtr--];
-       int length;
-       if ((length = astLengthStack[astLengthPtr--]) != 0) {
-               astPtr -= length;
-               if (astStack[astPtr + 1] instanceof ExplicitConstructorCall)
-                       //avoid a isSomeThing that would only be used here BUT what is faster between two alternatives ?
-                       {
-                       System.arraycopy(
-                               astStack, 
-                               astPtr + 2, 
-                               cd.statements = new Statement[length - 1], 
-                               0, 
-                               length - 1); 
-                       cd.constructorCall = (ExplicitConstructorCall) astStack[astPtr + 1];
-               } else { //need to add explicitly the super();
-                       System.arraycopy(
-                               astStack, 
-                               astPtr + 1, 
-                               cd.statements = new Statement[length], 
-                               0, 
-                               length); 
-                       cd.constructorCall = SuperReference.implicitSuperConstructorCall();
-               }
-       } else {
-               cd.constructorCall = SuperReference.implicitSuperConstructorCall();
-       }
-
-       if (cd.constructorCall.sourceEnd == 0) {
-               cd.constructorCall.sourceEnd = cd.sourceEnd;
-               cd.constructorCall.sourceStart = cd.sourceStart;
-       }
-}
-// A P I
-
-public void parse(
-       Initializer ini, 
-       TypeDeclaration type, 
-       CompilationUnitDeclaration unit) {
-       //only parse the method body of md
-       //fill out method statements
-
-       //convert bugs into parse error
-
-       initialize();
-       goForInitializer();
-       nestedMethod[nestedType]++;
-
-       referenceContext = type;
-       compilationUnit = unit;
-
-       scanner.resetTo(ini.sourceStart, ini.sourceEnd); // just on the beginning {
-       try {
-               parse();
-       } catch (AbortCompilation ex) {
-               lastAct = ERROR_ACTION;
-       } finally {
-               nestedMethod[nestedType]--;
-       }
-
-       if (lastAct == ERROR_ACTION) {
-               return;
-       }
-
-       ini.block = ((Initializer) astStack[astPtr]).block;
-       
-       // mark initializer with local type if one was found during parsing
-       if ((type.bits & AstNode.HasLocalTypeMASK) != 0) {
-               ini.bits |= AstNode.HasLocalTypeMASK;
-       }       
-}
-// A P I
-
-public void parse(MethodDeclaration md, CompilationUnitDeclaration unit) {
-       //only parse the method body of md
-       //fill out method statements
-
-       //convert bugs into parse error
-
-       if (md.isAbstract())
-               return;
-       if (md.isNative())
-               return;
-       if ((md.modifiers & AccSemicolonBody) != 0)
-               return;
-
-       initialize();
-       goForMethodBody();
-       nestedMethod[nestedType]++;
-
-       referenceContext = md;
-       compilationUnit = unit;
-
-       scanner.resetTo(md.sourceEnd + 1, md.declarationSourceEnd); 
-       // reset the scanner to parser from { down to }
-       try {
-               parse();
-       } catch (AbortCompilation ex) {
-               lastAct = ERROR_ACTION;
-       } finally {
-               nestedMethod[nestedType]--;             
-       }
-
-       if (lastAct == ERROR_ACTION) {
-               return;
-       }
-
-       //refill statements
-       md.explicitDeclarations = realBlockStack[realBlockPtr--];
-       int length;
-       if ((length = astLengthStack[astLengthPtr--]) != 0)
-               System.arraycopy(
-                       astStack, 
-                       (astPtr -= length) + 1, 
-                       md.statements = new Statement[length], 
-                       0, 
-                       length); 
-}
-// A P I
-
-public CompilationUnitDeclaration parse(
-       ICompilationUnit sourceUnit, 
-       CompilationResult compilationResult) {
-       // parses a compilation unit and manages error handling (even bugs....)
-
-       CompilationUnitDeclaration unit;
-       try {
-               /* automaton initialization */
-               initialize();
-               goForCompilationUnit();
-
-               /* scanner initialization */
-               scanner.setSource(sourceUnit.getContents());
-
-               /* unit creation */
-               referenceContext = 
-                       compilationUnit = 
-                               new CompilationUnitDeclaration(
-                                       problemReporter, 
-                                       compilationResult, 
-                                       scanner.source.length);
-               /* run automaton */
-               parse();
-       } finally {
-               unit = compilationUnit;
-               compilationUnit = null; // reset parser
-       }
-       return unit;
-}
-// A P I
-
-public CompilationUnitDeclaration parse(
-       ICompilationUnit sourceUnit, 
-       CompilationResult compilationResult,
-       int start,
-       int end) {
-       // parses a compilation unit and manages error handling (even bugs....)
-
-       CompilationUnitDeclaration unit;
-       try {
-               /* automaton initialization */
-               initialize();
-               goForCompilationUnit();
-
-               /* scanner initialization */
-               scanner.setSource(sourceUnit.getContents());
-               scanner.resetTo(start, end);
-               /* unit creation */
-               referenceContext = 
-                       compilationUnit = 
-                               new CompilationUnitDeclaration(
-                                       problemReporter, 
-                                       compilationResult, 
-                                       scanner.source.length);
-               /* run automaton */
-               parse();
-       } finally {
-               unit = compilationUnit;
-               compilationUnit = null; // reset parser
-       }
-       return unit;
-}
-/**
- * Returns this parser's problem reporter initialized with its reference context.
- * Also it is assumed that a problem is going to be reported, so initializes
- * the compilation result's line positions.
- */
-public ProblemReporter problemReporter(){
-       if (scanner.recordLineSeparator) {
-               compilationUnit.compilationResult.lineSeparatorPositions = scanner.getLineEnds();
-       }
-       problemReporter.referenceContext = referenceContext;
-       return problemReporter;
-}
-protected void pushIdentifier() {
-       /*push the consumeToken on the identifier stack.
-       Increase the total number of identifier in the stack.
-       identifierPtr points on the next top */
-
-       try {
-               identifierStack[++identifierPtr] = scanner.getCurrentIdentifierSource();
-               identifierPositionStack[identifierPtr] = 
-                       (((long) scanner.startPosition) << 32) + (scanner.currentPosition - 1); 
-       } catch (IndexOutOfBoundsException e) {
-               /*---stack reallaocation (identifierPtr is correct)---*/
-               int oldStackLength = identifierStack.length;
-               char[][] oldStack = identifierStack;
-               identifierStack = new char[oldStackLength + 20][];
-               System.arraycopy(oldStack, 0, identifierStack, 0, oldStackLength);
-               identifierStack[identifierPtr] = scanner.getCurrentTokenSource();
-               /*identifier position stack*/
-               long[] oldPos = identifierPositionStack;
-               identifierPositionStack = new long[oldStackLength + 20];
-               System.arraycopy(oldPos, 0, identifierPositionStack, 0, oldStackLength);
-               identifierPositionStack[identifierPtr] = 
-                       (((long) scanner.startPosition) << 32) + (scanner.currentPosition - 1); 
-       };
-
-       try {
-               identifierLengthStack[++identifierLengthPtr] = 1;
-       } catch (IndexOutOfBoundsException e) {
-               /*---stack reallocation (identifierLengthPtr is correct)---*/
-               int oldStackLength = identifierLengthStack.length;
-               int oldStack[] = identifierLengthStack;
-               identifierLengthStack = new int[oldStackLength + 10];
-               System.arraycopy(oldStack, 0, identifierLengthStack, 0, oldStackLength);
-               identifierLengthStack[identifierLengthPtr] = 1;
-       };
+      case 354 : // System.out.println("RelationalExpression ::= RelationalExpression LESS ShiftExpression");
+        consumeBinaryExpression(OperatorExpression.LESS);
+        break;
 
-}
-protected void pushIdentifier(int flag) {
-       /*push a special flag on the stack :
-       -zero stands for optional Name
-       -negative number for direct ref to base types.
-       identifierLengthPtr points on the top */
-
-       try {
-               identifierLengthStack[++identifierLengthPtr] = flag;
-       } catch (IndexOutOfBoundsException e) {
-               /*---stack reallaocation (identifierLengthPtr is correct)---*/
-               int oldStackLength = identifierLengthStack.length;
-               int oldStack[] = identifierLengthStack;
-               identifierLengthStack = new int[oldStackLength + 10];
-               System.arraycopy(oldStack, 0, identifierLengthStack, 0, oldStackLength);
-               identifierLengthStack[identifierLengthPtr] = flag;
-       };
+      case 355 : // System.out.println("RelationalExpression ::= RelationalExpression GREATER ShiftExpression");
+        consumeBinaryExpression(OperatorExpression.GREATER);
+        break;
 
-}
-protected void pushOnAstLengthStack(int pos) {
-       try {
-               astLengthStack[++astLengthPtr] = pos;
-       } catch (IndexOutOfBoundsException e) {
-               int oldStackLength = astLengthStack.length;
-               int[] oldPos = astLengthStack;
-               astLengthStack = new int[oldStackLength + StackIncrement];
-               System.arraycopy(oldPos, 0, astLengthStack, 0, oldStackLength);
-               astLengthStack[astLengthPtr] = pos;
-       }
-}
-protected void pushOnAstStack(AstNode node) {
-       /*add a new obj on top of the ast stack
-       astPtr points on the top*/
-
-       try {
-               astStack[++astPtr] = node;
-       } catch (IndexOutOfBoundsException e) {
-               int oldStackLength = astStack.length;
-               AstNode[] oldStack = astStack;
-               astStack = new AstNode[oldStackLength + AstStackIncrement];
-               System.arraycopy(oldStack, 0, astStack, 0, oldStackLength);
-               astPtr = oldStackLength;
-               astStack[astPtr] = node;
-       }
-
-       try {
-               astLengthStack[++astLengthPtr] = 1;
-       } catch (IndexOutOfBoundsException e) {
-               int oldStackLength = astLengthStack.length;
-               int[] oldPos = astLengthStack;
-               astLengthStack = new int[oldStackLength + AstStackIncrement];
-               System.arraycopy(oldPos, 0, astLengthStack, 0, oldStackLength);
-               astLengthStack[astLengthPtr] = 1;
-       }
-}
-protected void pushOnExpressionStack(Expression expr) {
-
-       try {
-               expressionStack[++expressionPtr] = expr;
-       } catch (IndexOutOfBoundsException e) {
-               //expressionPtr is correct 
-               int oldStackLength = expressionStack.length;
-               Expression[] oldStack = expressionStack;
-               expressionStack = new Expression[oldStackLength + ExpressionStackIncrement];
-               System.arraycopy(oldStack, 0, expressionStack, 0, oldStackLength);
-               expressionStack[expressionPtr] = expr;
-       }
-
-       try {
-               expressionLengthStack[++expressionLengthPtr] = 1;
-       } catch (IndexOutOfBoundsException e) {
-               int oldStackLength = expressionLengthStack.length;
-               int[] oldPos = expressionLengthStack;
-               expressionLengthStack = new int[oldStackLength + ExpressionStackIncrement];
-               System.arraycopy(oldPos, 0, expressionLengthStack, 0, oldStackLength);
-               expressionLengthStack[expressionLengthPtr] = 1;
-       }
-}
-protected void pushOnExpressionStackLengthStack(int pos) {
-       try {
-               expressionLengthStack[++expressionLengthPtr] = pos;
-       } catch (IndexOutOfBoundsException e) {
-               int oldStackLength = expressionLengthStack.length;
-               int[] oldPos = expressionLengthStack;
-               expressionLengthStack = new int[oldStackLength + StackIncrement];
-               System.arraycopy(oldPos, 0, expressionLengthStack, 0, oldStackLength);
-               expressionLengthStack[expressionLengthPtr] = pos;
-       }
-}
-protected void pushOnIntStack(int pos) {
-
-       try {
-               intStack[++intPtr] = pos;
-       } catch (IndexOutOfBoundsException e) {
-               //intPtr is correct 
-               int oldStackLength = intStack.length;
-               int oldStack[] = intStack;
-               intStack = new int[oldStackLength + StackIncrement];
-               System.arraycopy(oldStack, 0, intStack, 0, oldStackLength);
-               intStack[intPtr] = pos;
-       }
-}
-protected static char[] readTable(String filename) throws java.io.IOException {
-
-       //files are located at Parser.class directory
-
-       InputStream stream = new BufferedInputStream(Parser.class.getResourceAsStream(filename));
-       if (stream == null) {
-               throw new java.io.IOException(Util.bind("parser.missingFile",filename)); //$NON-NLS-1$
-       }
-       byte[] bytes = null;
-       try {
-               bytes = Util.getInputStreamAsByteArray(stream, -1);
-       } finally {
-               try {
-                       stream.close();
-               } catch (IOException e) {
-               }
-       }
-
-       //minimal integrity check (even size expected)
-       int length = bytes.length;
-       if (length % 2 != 0)
-               throw new java.io.IOException(Util.bind("parser.corruptedFile",filename)); //$NON-NLS-1$
-
-       // convert bytes into chars
-       char[] chars = new char[length / 2];
-       int i = 0;
-       int charIndex = 0;
-
-       while (true) {
-               chars[charIndex++] = (char) (((bytes[i++] & 0xFF) << 8) + (bytes[i++] & 0xFF));
-               if (i == length)
-                       break;
-       }
-       return chars;
-}
-/* Token check performed on every token shift once having entered
- * recovery mode.
- */
-public void recoveryTokenCheck() {
-       switch (currentToken) {
-               case TokenNameLBRACE : {
-                       RecoveredElement newElement = 
-                               currentElement.updateOnOpeningBrace(scanner.currentPosition - 1);
-                       lastCheckPoint = scanner.currentPosition;                               
-                       if (newElement != null){ // null means nothing happened
-                               restartRecovery = true; // opening brace detected
-                               currentElement = newElement;
-                       }
-                       break;
-               }
-               case TokenNameRBRACE : {
-                       endPosition = this.flushAnnotationsDefinedPriorTo(scanner.currentPosition - 1);
-                       RecoveredElement newElement =
-                               currentElement.updateOnClosingBrace(scanner.startPosition, scanner.currentPosition -1);
-                               lastCheckPoint = scanner.currentPosition;
-                               if (newElement != currentElement){
-                               currentElement = newElement;
-                       }
-               }
-       }
-}
-protected void reportSyntaxError(int act, int currentKind, int stateStackTop) {
-
-       /* remember current scanner position */
-       int startPos = scanner.startPosition;
-       int currentPos = scanner.currentPosition;
-       
-       String[] expectings;
-       String tokenName = name[symbol_index[currentKind]];
-
-       //fetch all "accurate" possible terminals that could recover the error
-       int start, end = start = asi(stack[stateStackTop]);
-       while (asr[end] != 0)
-               end++;
-       int length = end - start;
-       expectings = new String[length];
-       if (length != 0) {
-               char[] indexes = new char[length];
-               System.arraycopy(asr, start, indexes, 0, length);
-               for (int i = 0; i < length; i++) {
-                       expectings[i] = name[symbol_index[indexes[i]]];
-               }
-       }
-
-       //if the pb is an EOF, try to tell the user that they are some 
-       if (tokenName.equals(UNEXPECTED_EOF)) {
-               if (!this.checkAndReportBracketAnomalies(problemReporter())) {
-                       char[] tokenSource;
-                       try {
-                               tokenSource = this.scanner.getCurrentTokenSource();
-                       } catch (Exception e) {
-                               tokenSource = new char[] {};
-                       }
-                       problemReporter().parseError(
-                               this.scanner.startPosition, 
-                               this.scanner.currentPosition - 1, 
-                               tokenSource, 
-                               tokenName, 
-                               expectings); 
-               }
-       } else { //the next test is HEAVILY grammar DEPENDENT.
-               if ((length == 2)
-                       && (tokenName.equals(";")) //$NON-NLS-1$
-                       && (expectings[0] == "++") //$NON-NLS-1$
-                       && (expectings[1] == "--") //$NON-NLS-1$
-                       && (expressionPtr > -1)) {
-                       // the ; is not the expected token ==> it ends a statement when an expression is not ended
-                       problemReporter().invalidExpressionAsStatement(expressionStack[expressionPtr]);
-               } else {
-                       char[] tokenSource;
-                       try {
-                               tokenSource = this.scanner.getCurrentTokenSource();
-                       } catch (Exception e) {
-                               tokenSource = new char[] {};
-                       }
-                       problemReporter().parseError(
-                               this.scanner.startPosition, 
-                               this.scanner.currentPosition - 1, 
-                               tokenSource, 
-                               tokenName, 
-                               expectings); 
-                       this.checkAndReportBracketAnomalies(problemReporter());
-               }
-       }
-       /* reset scanner where it was */
-       scanner.startPosition = startPos;
-       scanner.currentPosition = currentPos;
-}
-protected void resetModifiers() {
-       modifiers = AccDefault;
-       modifiersSourceStart = -1; // <-- see comment into modifiersFlag(int)
-       scanner.commentPtr = -1;
-}
-/*
- * Reset context so as to resume to regular parse loop
- */
-protected void resetStacks() {
-
-       astPtr = -1;
-       astLengthPtr = -1;
-       expressionPtr = -1;
-       expressionLengthPtr = -1;
-       identifierPtr = -1;     
-       identifierLengthPtr     = -1;
-       intPtr = -1;
-       nestedMethod[nestedType = 0] = 0; // need to reset for further reuse
-       variablesCounter[nestedType] = 0;
-       dimensions = 0 ;
-       realBlockStack[realBlockPtr = 0] = 0;
-       recoveredStaticInitializerStart = 0;
-       listLength = 0;
-}
-/*
- * Reset context so as to resume to regular parse loop
- * If unable to reset for resuming, answers false.
- *
- * Move checkpoint location, reset internal stacks and
- * decide which grammar goal is activated.
- */
-protected boolean resumeAfterRecovery() {
-
-       // reset internal stacks 
-       this.resetStacks();
-       
-       /* attempt to move checkpoint location */
-       if (!this.moveRecoveryCheckpoint()) return false;
-
-       // only look for headers
-       if (referenceContext instanceof CompilationUnitDeclaration){
-               goForHeaders();
-               diet = true; // passed this point, will not consider method bodies
-               return true;
-       }
-       // does not know how to restart
-       return false;
-}
-/*
- * Syntax error was detected. Will attempt to perform some recovery action in order
- * to resume to the regular parse loop.
- */
-protected boolean resumeOnSyntaxError() {
-
-       /* request recovery initialization */
-       if (currentElement == null){
-               currentElement = 
-                       this.buildInitialRecoveryState(); // build some recovered elements
-       }
-       /* do not investigate deeper in recovery when no recovered element */
-       if (currentElement == null) return false;
-       
-       /* manual forced recovery restart - after headers */
-       if (restartRecovery){
-               restartRecovery = false;
-       }
-       /* update recovery state with current error state of the parser */
-       this.updateRecoveryState();
-       
-       /* attempt to reset state in order to resume to parse loop */
-       return this.resumeAfterRecovery();
-}
-protected static int tAction(int state, int sym) {
-       return action[check(state + sym) == sym ? state + sym : state];
-}
-public String toString() {
-
-       String s = "identifierStack : char[][] = {"; //$NON-NLS-1$
-       for (int i = 0; i <= identifierPtr; i++) {
-               s = s + "\"" + String.valueOf(identifierStack[i]) + "\","; //$NON-NLS-1$ //$NON-NLS-2$
-       };
-       s = s + "}\n"; //$NON-NLS-1$
-
-       s = s + "identierLengthStack : int[] = {"; //$NON-NLS-1$
-       for (int i = 0; i <= identifierLengthPtr; i++) {
-               s = s + identifierLengthStack[i] + ","; //$NON-NLS-1$
-       };
-       s = s + "}\n"; //$NON-NLS-1$
-
-       s = s + "astLengthStack : int[] = {"; //$NON-NLS-1$
-       for (int i = 0; i <= astLengthPtr; i++) {
-               s = s + astLengthStack[i] + ","; //$NON-NLS-1$
-       };
-       s = s + "}\n"; //$NON-NLS-1$
-       s = s + "astPtr : int = " + String.valueOf(astPtr) + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
-
-       s = s + "intStack : int[] = {"; //$NON-NLS-1$
-       for (int i = 0; i <= intPtr; i++) {
-               s = s + intStack[i] + ","; //$NON-NLS-1$
-       };
-       s = s + "}\n"; //$NON-NLS-1$
-
-       s = s + "expressionLengthStack : int[] = {"; //$NON-NLS-1$
-       for (int i = 0; i <= expressionLengthPtr; i++) {
-               s = s + expressionLengthStack[i] + ","; //$NON-NLS-1$
-       };
-       s = s + "}\n"; //$NON-NLS-1$
-
-       s = s + "expressionPtr : int = " + String.valueOf(expressionPtr) + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
-
-       s = s + "\n\n\n----------------Scanner--------------\n" + scanner.toString(); //$NON-NLS-1$
-       return s;
+      case 356 : // System.out.println("RelationalExpression ::= RelationalExpression LESS_EQUAL ShiftExpression");
+        consumeBinaryExpression(OperatorExpression.LESS_EQUAL);
+        break;
 
-}
-/*
- * Update recovery state based on current parser/scanner state
- */
-protected void updateRecoveryState() {
-
-       /* expose parser state to recovery state */
-       currentElement.updateFromParserState();
-
-       /* check and update recovered state based on current token,
-               this action is also performed when shifting token after recovery
-               got activated once. 
-       */
-       this.recoveryTokenCheck();
-}
-protected void updateSourceDeclarationParts(int variableDeclaratorsCounter) {
-       //fields is a definition of fields that are grouped together like in
-       //public int[] a, b[], c
-       //which results into 3 fields.
-
-       FieldDeclaration field;
-       int endTypeDeclarationPosition = 
-               -1 + astStack[astPtr - variableDeclaratorsCounter + 1].sourceStart; 
-       for (int i = 0; i < variableDeclaratorsCounter - 1; i++) {
-               //last one is special(see below)
-               field = (FieldDeclaration) astStack[astPtr - i - 1];
-               field.endPart1Position = endTypeDeclarationPosition;
-               field.endPart2Position = -1 + astStack[astPtr - i].sourceStart;
-       }
-       //last one
-       (field = (FieldDeclaration) astStack[astPtr]).endPart1Position = 
-               endTypeDeclarationPosition; 
-       field.endPart2Position = field.declarationSourceEnd;
+      case 357 : // System.out.println("RelationalExpression ::= RelationalExpression GREATER_EQUAL ShiftExpression");
+        consumeBinaryExpression(OperatorExpression.GREATER_EQUAL);
+        break;
 
-}
-protected void updateSourcePosition(Expression exp) {
-       //update the source Position of the expression
+      case 358 : // System.out.println("RelationalExpression ::= RelationalExpression instanceof ReferenceType");
+        consumeInstanceOfExpression(OperatorExpression.INSTANCEOF);
+        break;
 
-       //intStack : int int
-       //-->
-       //intStack : 
+      case 360 : // System.out.println("EqualityExpression ::= EqualityExpression EQUAL_EQUAL RelationalExpression");
+        consumeEqualityExpression(OperatorExpression.EQUAL_EQUAL);
+        break;
 
-       exp.sourceEnd = intStack[intPtr--];
-       exp.sourceStart = intStack[intPtr--];
-}
+      case 361 : // System.out.println("EqualityExpression ::= EqualityExpression NOT_EQUAL RelationalExpression");
+        consumeEqualityExpression(OperatorExpression.NOT_EQUAL);
+        break;
+
+      case 363 : // System.out.println("AndExpression ::= AndExpression AND EqualityExpression");
+        consumeBinaryExpression(OperatorExpression.AND);
+        break;
+
+      case 365 : // System.out.println("ExclusiveOrExpression ::= ExclusiveOrExpression XOR AndExpression");
+        consumeBinaryExpression(OperatorExpression.XOR);
+        break;
+
+      case 367 : // System.out.println("InclusiveOrExpression ::= InclusiveOrExpression OR ExclusiveOrExpression");
+        consumeBinaryExpression(OperatorExpression.OR);
+        break;
+
+      case 369 : // System.out.println("ConditionalAndExpression ::= ConditionalAndExpression AND_AND InclusiveOrExpression");
+        consumeBinaryExpression(OperatorExpression.AND_AND);
+        break;
+
+      case 371 : // System.out.println("ConditionalOrExpression ::= ConditionalOrExpression OR_OR ConditionalAndExpression");
+        consumeBinaryExpression(OperatorExpression.OR_OR);
+        break;
+
+      case 373 : // System.out.println("ConditionalExpression ::= ConditionalOrExpression QUESTION Expression COLON...");
+        consumeConditionalExpression(OperatorExpression.QUESTIONCOLON);
+        break;
+
+      case 376 : // System.out.println("Assignment ::= LeftHandSide AssignmentOperator AssignmentExpression");
+        consumeAssignment();
+        break;
+
+      case 378 : // System.out.println("Assignment ::= InvalidArrayInitializerAssignement");
+        ignoreExpressionAssignment();
+        break;
+
+      case 379 : // System.out.println("LeftHandSide ::= Name");
+        consumeLeftHandSide();
+        break;
+
+      case 382 : // System.out.println("AssignmentOperator ::= EQUAL");
+        consumeAssignmentOperator(EQUAL);
+        break;
+
+      case 383 : // System.out.println("AssignmentOperator ::= MULTIPLY_EQUAL");
+        consumeAssignmentOperator(MULTIPLY);
+        break;
+
+      case 384 : // System.out.println("AssignmentOperator ::= DIVIDE_EQUAL");
+        consumeAssignmentOperator(DIVIDE);
+        break;
+
+      case 385 : // System.out.println("AssignmentOperator ::= REMAINDER_EQUAL");
+        consumeAssignmentOperator(REMAINDER);
+        break;
+
+      case 386 : // System.out.println("AssignmentOperator ::= PLUS_EQUAL");
+        consumeAssignmentOperator(PLUS);
+        break;
+
+      case 387 : // System.out.println("AssignmentOperator ::= MINUS_EQUAL");
+        consumeAssignmentOperator(MINUS);
+        break;
+
+      case 388 : // System.out.println("AssignmentOperator ::= LEFT_SHIFT_EQUAL");
+        consumeAssignmentOperator(LEFT_SHIFT);
+        break;
+
+      case 389 : // System.out.println("AssignmentOperator ::= RIGHT_SHIFT_EQUAL");
+        consumeAssignmentOperator(RIGHT_SHIFT);
+        break;
+
+      case 390 : // System.out.println("AssignmentOperator ::= UNSIGNED_RIGHT_SHIFT_EQUAL");
+        consumeAssignmentOperator(UNSIGNED_RIGHT_SHIFT);
+        break;
+
+      case 391 : // System.out.println("AssignmentOperator ::= AND_EQUAL");
+        consumeAssignmentOperator(AND);
+        break;
+
+      case 392 : // System.out.println("AssignmentOperator ::= XOR_EQUAL");
+        consumeAssignmentOperator(XOR);
+        break;
+
+      case 393 : // System.out.println("AssignmentOperator ::= OR_EQUAL");
+        consumeAssignmentOperator(OR);
+        break;
+
+      case 400 : // System.out.println("Expressionopt ::=");
+        consumeEmptyExpression();
+        break;
+
+      case 404 : // System.out.println("ImportDeclarationsopt ::=");
+        consumeEmptyImportDeclarationsopt();
+        break;
+
+      case 405 : // System.out.println("ImportDeclarationsopt ::= ImportDeclarations");
+        consumeImportDeclarationsopt();
+        break;
+
+      case 406 : // System.out.println("TypeDeclarationsopt ::=");
+        consumeEmptyTypeDeclarationsopt();
+        break;
+
+      case 407 : // System.out.println("TypeDeclarationsopt ::= TypeDeclarations");
+        consumeTypeDeclarationsopt();
+        break;
+
+      case 408 : // System.out.println("ClassBodyDeclarationsopt ::=");
+        consumeEmptyClassBodyDeclarationsopt();
+        break;
+
+      case 409 : // System.out.println("ClassBodyDeclarationsopt ::= NestedType ClassBodyDeclarations");
+        consumeClassBodyDeclarationsopt();
+        break;
+
+      case 410 : // System.out.println("Modifiersopt ::=");
+        consumeDefaultModifiers();
+        break;
+
+      case 411 : // System.out.println("Modifiersopt ::= Modifiers");
+        consumeModifiers();
+        break;
+
+      case 412 : // System.out.println("BlockStatementsopt ::=");
+        consumeEmptyBlockStatementsopt();
+        break;
+
+      case 414 : // System.out.println("Dimsopt ::=");
+        consumeEmptyDimsopt();
+        break;
+
+      case 416 : // System.out.println("ArgumentListopt ::=");
+        consumeEmptyArgumentListopt();
+        break;
+
+      case 420 : // System.out.println("FormalParameterListopt ::=");
+        consumeFormalParameterListopt();
+        break;
+
+      case 424 : // System.out.println("InterfaceMemberDeclarationsopt ::=");
+        consumeEmptyInterfaceMemberDeclarationsopt();
+        break;
+
+      case 425 : // System.out.println("InterfaceMemberDeclarationsopt ::= NestedType InterfaceMemberDeclarations");
+        consumeInterfaceMemberDeclarationsopt();
+        break;
+
+      case 426 : // System.out.println("NestedType ::=");
+        consumeNestedType();
+        break;
+
+      case 427 : // System.out.println("ForInitopt ::=");
+        consumeEmptyForInitopt();
+        break;
+
+      case 429 : // System.out.println("ForUpdateopt ::=");
+        consumeEmptyForUpdateopt();
+        break;
+
+      case 433 : // System.out.println("Catchesopt ::=");
+        consumeEmptyCatchesopt();
+        break;
+
+      case 435 : // System.out.println("ArrayInitializeropt ::=");
+        consumeEmptyArrayInitializeropt();
+        break;
+
+    }
+  }
+
+  protected void consumeSimpleAssertStatement() {
+    // AssertStatement ::= 'assert' Expression ';'
+    expressionLengthPtr--;
+    pushOnAstStack(new AssertStatement(expressionStack[expressionPtr--], intStack[intPtr--]));
+  }
+
+  protected void consumeSingleTypeImportDeclaration() {
+    // SingleTypeImportDeclaration ::= SingleTypeImportDeclarationName ';'
+
+    ImportReference impt = (ImportReference) astStack[astPtr];
+    // flush annotations defined prior to import statements
+    impt.declarationEnd = endStatementPosition;
+    impt.declarationSourceEnd = this.flushAnnotationsDefinedPriorTo(impt.declarationSourceEnd);
+
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = impt.declarationSourceEnd + 1;
+      currentElement = currentElement.add(impt, 0);
+      lastIgnoredToken = -1;
+      restartRecovery = true;
+      // used to avoid branching back into the regular automaton
+    }
+  }
+  protected void consumeSingleTypeImportDeclarationName() {
+    // SingleTypeImportDeclarationName ::= 'import' Name
+    /* push an ImportRef build from the last name 
+    stored in the identifier stack. */
+
+    ImportReference impt;
+    int length;
+    char[][] tokens = new char[length = identifierLengthStack[identifierLengthPtr--]][];
+    identifierPtr -= length;
+    long[] positions = new long[length];
+    System.arraycopy(identifierStack, identifierPtr + 1, tokens, 0, length);
+    System.arraycopy(identifierPositionStack, identifierPtr + 1, positions, 0, length);
+    pushOnAstStack(impt = new ImportReference(tokens, positions, false));
+
+    if (currentToken == TokenNameSEMICOLON) {
+      impt.declarationSourceEnd = scanner.currentPosition - 1;
+    } else {
+      impt.declarationSourceEnd = impt.sourceEnd;
+    }
+    impt.declarationEnd = impt.declarationSourceEnd;
+    //endPosition is just before the ;
+    impt.declarationSourceStart = intStack[intPtr--];
+
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = impt.declarationSourceEnd + 1;
+      currentElement = currentElement.add(impt, 0);
+      lastIgnoredToken = -1;
+      restartRecovery = true; // used to avoid branching back into the regular automaton               
+    }
+  }
+  protected void consumeStatementBreak() {
+    // BreakStatement ::= 'break' ';'
+    // break pushs a position on intStack in case there is no label
+
+    pushOnAstStack(new Break(null, intStack[intPtr--], endPosition));
+  }
+  protected void consumeStatementBreakWithLabel() {
+    // BreakStatement ::= 'break' Identifier ';'
+    // break pushs a position on intStack in case there is no label
+
+    pushOnAstStack(new Break(identifierStack[identifierPtr--], intStack[intPtr--], endPosition));
+    identifierLengthPtr--;
+  }
+  protected void consumeStatementCatch() {
+    // CatchClause ::= 'catch' '(' FormalParameter ')'    Block
+
+    //catch are stored directly into the Try
+    //has they always comes two by two....
+    //we remove one entry from the astlengthPtr.
+    //The construction of the try statement must
+    //then fetch the catches using  2*i and 2*i + 1
+
+    astLengthPtr--;
+    listLength = 0; // reset formalParameter counter (incremented for catch variable)
+  }
+  protected void consumeStatementContinue() {
+    // ContinueStatement ::= 'continue' ';'
+    // continue pushs a position on intStack in case there is no label
+
+    pushOnAstStack(new Continue(null, intStack[intPtr--], endPosition));
+  }
+  protected void consumeStatementContinueWithLabel() {
+    // ContinueStatement ::= 'continue' Identifier ';'
+    // continue pushs a position on intStack in case there is no label
+
+    pushOnAstStack(new Continue(identifierStack[identifierPtr--], intStack[intPtr--], endPosition));
+    identifierLengthPtr--;
+  }
+  protected void consumeStatementDo() {
+    // DoStatement ::= 'do' Statement 'while' '(' Expression ')' ';'
+
+    //the 'while' pushes a value on intStack that we need to remove
+    intPtr--;
+
+    //optimize the push/pop
+    Statement action = (Statement) astStack[astPtr];
+    if (action instanceof EmptyStatement && problemReporter.options.complianceLevel <= CompilerOptions.JDK1_3) {
+      expressionLengthPtr--;
+      astStack[astPtr] = new DoStatement(expressionStack[expressionPtr--], null, intStack[intPtr--], endPosition);
+    } else {
+      expressionLengthPtr--;
+      astStack[astPtr] = new DoStatement(expressionStack[expressionPtr--], action, intStack[intPtr--], endPosition);
+    }
+  }
+  protected void consumeStatementExpressionList() {
+    // StatementExpressionList ::= StatementExpressionList ',' StatementExpression
+    concatExpressionLists();
+  }
+  protected void consumeStatementFor() {
+    // ForStatement ::= 'for' '(' ForInitopt ';' Expressionopt ';' ForUpdateopt ')' Statement
+    // ForStatementNoShortIf ::= 'for' '(' ForInitopt ';' Expressionopt ';' ForUpdateopt ')' StatementNoShortIf
+
+    int length;
+    Expression cond = null;
+    Statement[] inits, updates;
+    Statement action;
+    boolean scope = true;
+
+    //statements
+    astLengthPtr--; // we need to consume it
+    action = (Statement) astStack[astPtr--];
+    if (action instanceof EmptyStatement && problemReporter.options.complianceLevel <= CompilerOptions.JDK1_3) {
+      action = null;
+    }
+
+    //updates are on the expresion stack
+    if ((length = expressionLengthStack[expressionLengthPtr--]) == 0) {
+      updates = null;
+    } else {
+      expressionPtr -= length;
+      System.arraycopy(expressionStack, expressionPtr + 1, updates = new Statement[length], 0, length);
+    }
+
+    if (expressionLengthStack[expressionLengthPtr--] != 0)
+      cond = expressionStack[expressionPtr--];
+
+    //inits may be on two different stacks
+    if ((length = astLengthStack[astLengthPtr--]) == 0) {
+      inits = null;
+      scope = false;
+    } else {
+      if (length == -1) { //on expressionStack
+        scope = false;
+        length = expressionLengthStack[expressionLengthPtr--];
+        expressionPtr -= length;
+        System.arraycopy(expressionStack, expressionPtr + 1, inits = new Statement[length], 0, length);
+      } else { //on astStack
+        astPtr -= length;
+        System.arraycopy(astStack, astPtr + 1, inits = new Statement[length], 0, length);
+      }
+    };
+    if (action instanceof Block) {
+      pushOnAstStack(new ForStatement(inits, cond, updates, action, scope, intStack[intPtr--], endStatementPosition));
+    } else {
+      pushOnAstStack(new ForStatement(inits, cond, updates, action, scope, intStack[intPtr--], endPosition));
+    }
+  }
+  protected void consumeStatementIfNoElse() {
+    // IfThenStatement ::=  'if' '(' Expression ')' Statement
+
+    //optimize the push/pop
+    expressionLengthPtr--;
+    Statement thenStatement = (Statement) astStack[astPtr];
+    if (thenStatement instanceof Block) {
+      astStack[astPtr] = new IfStatement(expressionStack[expressionPtr--], thenStatement, intStack[intPtr--], endStatementPosition);
+    } else if (thenStatement instanceof EmptyStatement) {
+      astStack[astPtr] = new IfStatement(expressionStack[expressionPtr--], Block.None, intStack[intPtr--], endStatementPosition);
+    } else {
+      astStack[astPtr] = new IfStatement(expressionStack[expressionPtr--], thenStatement, intStack[intPtr--], endStatementPosition);
+    }
+  }
+  protected void consumeStatementIfWithElse() {
+    // IfThenElseStatement ::=  'if' '(' Expression ')' StatementNoShortIf 'else' Statement
+    // IfThenElseStatementNoShortIf ::=  'if' '(' Expression ')' StatementNoShortIf 'else' StatementNoShortIf
+
+    astLengthPtr--; // optimized {..., Then, Else } ==> {..., If }
+    expressionLengthPtr--;
+    //optimize the push/pop
+    Statement elseStatement = (Statement) astStack[astPtr--];
+    Statement thenStatement = (Statement) astStack[astPtr];
+    if (elseStatement instanceof EmptyStatement) {
+      elseStatement = Block.None;
+    }
+    if (thenStatement instanceof EmptyStatement) {
+      thenStatement = Block.None;
+    }
+    if (elseStatement instanceof Block) {
+      astStack[astPtr] =
+        new IfStatement(expressionStack[expressionPtr--], thenStatement, elseStatement, intStack[intPtr--], endStatementPosition);
+    } else {
+      astStack[astPtr] =
+        new IfStatement(expressionStack[expressionPtr--], thenStatement, elseStatement, intStack[intPtr--], endStatementPosition);
+    }
+  }
+  protected void consumeStatementLabel() {
+    // LabeledStatement ::= 'Identifier' ':' Statement
+    // LabeledStatementNoShortIf ::= 'Identifier' ':' StatementNoShortIf
+
+    //optimize push/pop
+
+    Statement stmt = (Statement) astStack[astPtr];
+    if (stmt instanceof EmptyStatement) {
+      astStack[astPtr] =
+        new LabeledStatement(
+          identifierStack[identifierPtr],
+          Block.None,
+          (int) (identifierPositionStack[identifierPtr--] >>> 32),
+          endStatementPosition);
+    } else {
+      astStack[astPtr] =
+        new LabeledStatement(
+          identifierStack[identifierPtr],
+          stmt,
+          (int) (identifierPositionStack[identifierPtr--] >>> 32),
+          endStatementPosition);
+    }
+    identifierLengthPtr--;
+  }
+  protected void consumeStatementReturn() {
+    // ReturnStatement ::= 'return' Expressionopt ';'
+    // return pushs a position on intStack in case there is no expression
+
+    if (expressionLengthStack[expressionLengthPtr--] != 0) {
+      pushOnAstStack(new ReturnStatement(expressionStack[expressionPtr--], intStack[intPtr--], endPosition));
+    } else {
+      pushOnAstStack(new ReturnStatement(null, intStack[intPtr--], endPosition));
+    }
+  }
+  protected void consumeStatementSwitch() {
+    // SwitchStatement ::= 'switch' OpenBlock '(' Expression ')' SwitchBlock
+
+    //OpenBlock just makes the semantic action blockStart()
+    //the block is inlined but a scope need to be created
+    //if some declaration occurs.
+
+    int length;
+    SwitchStatement s = new SwitchStatement();
+    expressionLengthPtr--;
+    s.testExpression = expressionStack[expressionPtr--];
+    if ((length = astLengthStack[astLengthPtr--]) != 0) {
+      astPtr -= length;
+      System.arraycopy(astStack, astPtr + 1, s.statements = new Statement[length], 0, length);
+    }
+    s.explicitDeclarations = realBlockStack[realBlockPtr--];
+    pushOnAstStack(s);
+    intPtr--; // because of OpenBlock
+    s.sourceStart = intStack[intPtr--];
+    s.sourceEnd = endStatementPosition;
+  }
+  protected void consumeStatementSynchronized() {
+    // SynchronizedStatement ::= OnlySynchronized '(' Expression ')' Block
+    //optimize the push/pop
+
+    if (astLengthStack[astLengthPtr] == 0) {
+      astLengthStack[astLengthPtr] = 1;
+      expressionLengthPtr--;
+      astStack[++astPtr] =
+        new SynchronizedStatement(expressionStack[expressionPtr--], Block.None, intStack[intPtr--], endStatementPosition);
+    } else {
+      expressionLengthPtr--;
+      astStack[astPtr] =
+        new SynchronizedStatement(
+          expressionStack[expressionPtr--],
+          (Block) astStack[astPtr],
+          intStack[intPtr--],
+          endStatementPosition);
+    }
+    resetModifiers();
+  }
+  protected void consumeStatementThrow() {
+    // ThrowStatement ::= 'throw' Expression ';'
+    expressionLengthPtr--;
+    pushOnAstStack(new ThrowStatement(expressionStack[expressionPtr--], intStack[intPtr--]));
+  }
+  protected void consumeStatementTry(boolean withFinally) {
+    //TryStatement ::= 'try'  Block Catches
+    //TryStatement ::= 'try'  Block Catchesopt Finally
+
+    int length;
+    TryStatement tryStmt = new TryStatement();
+    //finally
+    if (withFinally) {
+      astLengthPtr--;
+      tryStmt.finallyBlock = (Block) astStack[astPtr--];
+    }
+    //catches are handle by two <argument-block> [see statementCatch]
+    if ((length = astLengthStack[astLengthPtr--]) != 0) {
+      if (length == 1) {
+        tryStmt.catchBlocks = new Block[] {(Block) astStack[astPtr--] };
+        tryStmt.catchArguments = new Argument[] {(Argument) astStack[astPtr--] };
+      } else {
+        Block[] bks = (tryStmt.catchBlocks = new Block[length]);
+        Argument[] args = (tryStmt.catchArguments = new Argument[length]);
+        while (length-- > 0) {
+          bks[length] = (Block) astStack[astPtr--];
+          args[length] = (Argument) astStack[astPtr--];
+        }
+      }
+    }
+    //try
+    astLengthPtr--;
+    tryStmt.tryBlock = (Block) astStack[astPtr--];
+
+    //positions
+    tryStmt.sourceEnd = endStatementPosition;
+    tryStmt.sourceStart = intStack[intPtr--];
+    pushOnAstStack(tryStmt);
+  }
+  protected void consumeStatementWhile() {
+    // WhileStatement ::= 'while' '(' Expression ')' Statement
+    // WhileStatementNoShortIf ::= 'while' '(' Expression ')' StatementNoShortIf
+
+    Statement action = (Statement) astStack[astPtr];
+    expressionLengthPtr--;
+    if (action instanceof Block) {
+      astStack[astPtr] = new WhileStatement(expressionStack[expressionPtr--], action, intStack[intPtr--], endStatementPosition);
+    } else {
+      if (action instanceof EmptyStatement && problemReporter.options.complianceLevel <= CompilerOptions.JDK1_3) {
+        astStack[astPtr] = new WhileStatement(expressionStack[expressionPtr--], null, intStack[intPtr--], endPosition);
+      } else {
+        astStack[astPtr] = new WhileStatement(expressionStack[expressionPtr--], action, intStack[intPtr--], endPosition);
+      }
+    }
+  }
+  protected void consumeStaticInitializer() {
+    // StaticInitializer ::=  StaticOnly Block
+    //push an Initializer
+    //optimize the push/pop
+    Initializer initializer = new Initializer((Block) astStack[astPtr], AccStatic);
+    astStack[astPtr] = initializer;
+    initializer.sourceEnd = endStatementPosition;
+    initializer.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition);
+    nestedMethod[nestedType]--;
+    initializer.declarationSourceStart = intStack[intPtr--];
+
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = initializer.declarationSourceEnd;
+      currentElement = currentElement.add(initializer, 0);
+      lastIgnoredToken = -1;
+    }
+  }
+  protected void consumeStaticOnly() {
+    // StaticOnly ::= 'static'
+    int savedModifiersSourceStart = modifiersSourceStart;
+    checkAnnotation(); // might update declaration source start
+    if (modifiersSourceStart >= savedModifiersSourceStart) {
+      modifiersSourceStart = savedModifiersSourceStart;
+    }
+    pushOnIntStack(modifiersSourceStart >= 0 ? modifiersSourceStart : scanner.startPosition);
+    jumpOverMethodBody();
+    nestedMethod[nestedType]++;
+    resetModifiers();
+
+    // recovery
+    if (currentElement != null) {
+      recoveredStaticInitializerStart = intStack[intPtr]; // remember start position only for static initializers
+    }
+  }
+  protected void consumeSwitchBlock() {
+    // SwitchBlock ::= '{' SwitchBlockStatements SwitchLabels '}'
+    concatNodeLists();
+  }
+  protected void consumeSwitchBlockStatement() {
+    // SwitchBlockStatement ::= SwitchLabels BlockStatements
+    concatNodeLists();
+  }
+  protected void consumeSwitchBlockStatements() {
+    // SwitchBlockStatements ::= SwitchBlockStatements SwitchBlockStatement
+    concatNodeLists();
+  }
+  protected void consumeSwitchLabels() {
+    // SwitchLabels ::= SwitchLabels SwitchLabel
+    optimizedConcatNodeLists();
+  }
+  protected void consumeToken(int type) {
+    /* remember the last consumed value */
+    /* try to minimize the number of build values */
+    if (scanner.wasNonExternalizedStringLiteral) {
+      StringLiteral[] literals = this.scanner.nonNLSStrings;
+      // could not reproduce, but this is the only NPE
+      // added preventive null check see PR 9035
+      if (literals != null) {
+        for (int i = 0, max = literals.length; i < max; i++) {
+          problemReporter().nonExternalizedStringLiteral(literals[i]);
+        }
+      }
+      scanner.currentLine = null;
+      scanner.wasNonExternalizedStringLiteral = false;
+    }
+    // clear the commentPtr of the scanner in case we read something different from a modifier
+    switch (type) {
+      //               case TokenNameabstract :
+      //               case TokenNamestrictfp :
+      //               case TokenNamefinal :
+      //               case TokenNamenative :
+      //               case TokenNameprivate :
+      //               case TokenNameprotected :
+      //               case TokenNamepublic :
+      //               case TokenNametransient :
+      //               case TokenNamevolatile :
+      case TokenNamestatic :
+        //             case TokenNamesynchronized :
+        break;
+      default :
+        scanner.commentPtr = -1;
+    }
+    //System.out.println(scanner.toStringAction(type));
+    switch (type) {
+      case TokenNameIdentifier :
+        pushIdentifier();
+        if (scanner.useAssertAsAnIndentifier) {
+          long positions = identifierPositionStack[identifierPtr];
+          problemReporter().useAssertAsAnIdentifier((int) (positions >>> 32), (int) positions);
+        }
+        scanner.commentPtr = -1;
+        break;
+        //             case TokenNameinterface :
+        //                     adjustInterfaceModifiers();
+        //                     //'class' is pushing two int (positions) on the stack ==> 'interface' needs to do it too....
+        //                     pushOnIntStack(scanner.startPosition);
+        //                     pushOnIntStack(scanner.currentPosition - 1);                    
+        //                     scanner.commentPtr = -1;
+        //                     break;
+        //             case TokenNameabstract :
+        //                     checkAndSetModifiers(AccAbstract);
+        //                     break;
+        //             case TokenNamestrictfp :
+        //                     checkAndSetModifiers(AccStrictfp);
+        //                     break;
+        //             case TokenNamefinal :
+        //                     checkAndSetModifiers(AccFinal);
+        //                     break;
+        //             case TokenNamenative :
+        //                     checkAndSetModifiers(AccNative);
+        //                     break;
+        //             case TokenNameprivate :
+        //                     checkAndSetModifiers(AccPrivate);
+        //                     break;
+        //             case TokenNameprotected :
+        //                     checkAndSetModifiers(AccProtected);
+        //                     break;
+        //             case TokenNamepublic :
+        //                     checkAndSetModifiers(AccPublic);
+        //                     break;
+        //             case TokenNametransient :
+        //                     checkAndSetModifiers(AccTransient);
+        //                     break;
+        //             case TokenNamevolatile :
+        //                     checkAndSetModifiers(AccVolatile);
+        //                     break;
+      case TokenNamestatic :
+        checkAndSetModifiers(AccStatic);
+        break;
+        //             case TokenNamesynchronized :
+        //                     this.synchronizedBlockSourceStart = scanner.startPosition;      
+        //                     checkAndSetModifiers(AccSynchronized);
+        //                     break;
+        //                     //==============================
+        //             case TokenNamevoid :
+        //                     pushIdentifier(-T_void);
+        //                     pushOnIntStack(scanner.currentPosition - 1);                            
+        //                     pushOnIntStack(scanner.startPosition);
+        //                     scanner.commentPtr = -1;
+        //                     break;
+        //                     //push a default dimension while void is not part of the primitive
+        //                     //declaration baseType and so takes the place of a type without getting into
+        //                     //regular type parsing that generates a dimension on intStack
+        //             case TokenNameboolean :
+        //                     pushIdentifier(-T_boolean);
+        //                     pushOnIntStack(scanner.currentPosition - 1);                            
+        //                     pushOnIntStack(scanner.startPosition);          
+        //                     scanner.commentPtr = -1;
+        //                     break;
+        //             case TokenNamebyte :
+        //                     pushIdentifier(-T_byte);
+        //                     pushOnIntStack(scanner.currentPosition - 1);                            
+        //                     pushOnIntStack(scanner.startPosition);                                  
+        //                     scanner.commentPtr = -1;
+        //                     break;
+        //             case TokenNamechar :
+        //                     pushIdentifier(-T_char);
+        //                     pushOnIntStack(scanner.currentPosition - 1);                            
+        //                     pushOnIntStack(scanner.startPosition);                                  
+        //                     scanner.commentPtr = -1;
+        //                     break;
+        //             case TokenNamedouble :
+        //                     pushIdentifier(-T_double);
+        //                     pushOnIntStack(scanner.currentPosition - 1);                            
+        //                     pushOnIntStack(scanner.startPosition);                                  
+        //                     scanner.commentPtr = -1;
+        //                     break;
+        //             case TokenNamefloat :
+        //                     pushIdentifier(-T_float);
+        //                     pushOnIntStack(scanner.currentPosition - 1);                            
+        //                     pushOnIntStack(scanner.startPosition);                                  
+        //                     scanner.commentPtr = -1;
+        //                     break;
+        //             case TokenNameint :
+        //                     pushIdentifier(-T_int);
+        //                     pushOnIntStack(scanner.currentPosition - 1);                            
+        //                     pushOnIntStack(scanner.startPosition);                                  
+        //                     scanner.commentPtr = -1;
+        //                     break;
+        //             case TokenNamelong :
+        //                     pushIdentifier(-T_long);
+        //                     pushOnIntStack(scanner.currentPosition - 1);                            
+        //                     pushOnIntStack(scanner.startPosition);                                  
+        //                     scanner.commentPtr = -1;
+        //                     break;
+        //             case TokenNameshort :
+        //                     pushIdentifier(-T_short);
+        //                     pushOnIntStack(scanner.currentPosition - 1);                            
+        //                     pushOnIntStack(scanner.startPosition);                                  
+        //                     scanner.commentPtr = -1;
+        //                     break;
+        //==============================
+      case TokenNameIntegerLiteral :
+        pushOnExpressionStack(new IntLiteral(scanner.getCurrentTokenSource(), scanner.startPosition, scanner.currentPosition - 1));
+        scanner.commentPtr = -1;
+        break;
+      case TokenNameLongLiteral :
+        pushOnExpressionStack(new LongLiteral(scanner.getCurrentTokenSource(), scanner.startPosition, scanner.currentPosition - 1));
+        scanner.commentPtr = -1;
+        break;
+      case TokenNameFloatingPointLiteral :
+        pushOnExpressionStack(
+          new FloatLiteral(scanner.getCurrentTokenSource(), scanner.startPosition, scanner.currentPosition - 1));
+        scanner.commentPtr = -1;
+        break;
+      case TokenNameDoubleLiteral :
+        pushOnExpressionStack(
+          new DoubleLiteral(scanner.getCurrentTokenSource(), scanner.startPosition, scanner.currentPosition - 1));
+        scanner.commentPtr = -1;
+        break;
+      case TokenNameCharacterLiteral :
+        pushOnExpressionStack(new CharLiteral(scanner.getCurrentTokenSource(), scanner.startPosition, scanner.currentPosition - 1));
+        scanner.commentPtr = -1;
+        break;
+      case TokenNameStringLiteral :
+        StringLiteral stringLiteral =
+          new StringLiteral(scanner.getCurrentTokenSourceString(), scanner.startPosition, scanner.currentPosition - 1);
+        pushOnExpressionStack(stringLiteral);
+        scanner.commentPtr = -1;
+        break;
+      case TokenNamefalse :
+        pushOnExpressionStack(new FalseLiteral(scanner.startPosition, scanner.currentPosition - 1));
+        scanner.commentPtr = -1;
+        break;
+      case TokenNametrue :
+        pushOnExpressionStack(new TrueLiteral(scanner.startPosition, scanner.currentPosition - 1));
+        break;
+      case TokenNamenull :
+        pushOnExpressionStack(new NullLiteral(scanner.startPosition, scanner.currentPosition - 1));
+        break;
+        //============================
+        //             case TokenNamesuper :
+        //             case TokenNamethis :
+        //                     endPosition = scanner.currentPosition - 1;
+        //                     pushOnIntStack(scanner.startPosition);
+        //                     break;
+        //             case TokenNameassert :
+        //             case TokenNameimport :
+        //             case TokenNamepackage :
+        //             case TokenNamethrow :
+      case TokenNamenew :
+      case TokenNamedo :
+      case TokenNameif :
+      case TokenNamefor :
+      case TokenNameswitch :
+        //             case TokenNametry :
+      case TokenNamewhile :
+      case TokenNamebreak :
+      case TokenNamecontinue :
+      case TokenNamereturn :
+      case TokenNamecase :
+        pushOnIntStack(scanner.startPosition);
+        break;
+      case TokenNameclass :
+        pushOnIntStack(scanner.currentPosition - 1);
+        pushOnIntStack(scanner.startPosition);
+        break;
+      case TokenNamedefault :
+        pushOnIntStack(scanner.startPosition);
+        pushOnIntStack(scanner.currentPosition - 1);
+        break;
+        //let extra semantic action decide when to push
+      case TokenNameRBRACKET :
+      case TokenNamePLUS :
+      case TokenNameMINUS :
+      case TokenNameNOT :
+      case TokenNameTWIDDLE :
+        endPosition = scanner.startPosition;
+        break;
+      case TokenNamePLUS_PLUS :
+      case TokenNameMINUS_MINUS :
+        endPosition = scanner.startPosition;
+        endStatementPosition = scanner.currentPosition - 1;
+        break;
+      case TokenNameRBRACE :
+      case TokenNameSEMICOLON :
+        endStatementPosition = scanner.currentPosition - 1;
+        endPosition = scanner.startPosition - 1;
+        //the item is not part of the potential futur expression/statement
+        break;
+        // in order to handle ( expression) ////// (cast)expression///// foo(x)
+      case TokenNameRPAREN :
+        rParenPos = scanner.currentPosition - 1; // position of the end of right parenthesis (in case of unicode \u0029) lex00101
+        break;
+      case TokenNameLPAREN :
+        lParenPos = scanner.startPosition;
+        break;
+        //  case TokenNameQUESTION  :
+        //  case TokenNameCOMMA :
+        //  case TokenNameCOLON  :
+        //  case TokenNameEQUAL  :
+        //  case TokenNameLBRACKET  :
+        //  case TokenNameDOT :
+        //  case TokenNameERROR :
+        //  case TokenNameEOF  :
+        //  case TokenNamecase  :
+        //  case TokenNamecatch  :
+        //  case TokenNameelse  :
+        //  case TokenNameextends  :
+        //  case TokenNamefinally  :
+        //  case TokenNameimplements  :
+        //  case TokenNamethrows  :
+        //  case TokenNameinstanceof  :
+        //  case TokenNameEQUAL_EQUAL  :
+        //  case TokenNameLESS_EQUAL  :
+        //  case TokenNameGREATER_EQUAL  :
+        //  case TokenNameNOT_EQUAL  :
+        //  case TokenNameLEFT_SHIFT  :
+        //  case TokenNameRIGHT_SHIFT  :
+        //  case TokenNameUNSIGNED_RIGHT_SHIFT :
+        //  case TokenNamePLUS_EQUAL  :
+        //  case TokenNameMINUS_EQUAL  :
+        //  case TokenNameMULTIPLY_EQUAL  :
+        //  case TokenNameDIVIDE_EQUAL  :
+        //  case TokenNameAND_EQUAL  :
+        //  case TokenNameOR_EQUAL  :
+        //  case TokenNameXOR_EQUAL  :
+        //  case TokenNameREMAINDER_EQUAL  :
+        //  case TokenNameLEFT_SHIFT_EQUAL  :
+        //  case TokenNameRIGHT_SHIFT_EQUAL  :
+        //  case TokenNameUNSIGNED_RIGHT_SHIFT_EQUAL  :
+        //  case TokenNameOR_OR  :
+        //  case TokenNameAND_AND  :
+        //  case TokenNameREMAINDER :
+        //  case TokenNameXOR  :
+        //  case TokenNameAND  :
+        //  case TokenNameMULTIPLY :
+        //  case TokenNameOR  :
+        //  case TokenNameDIVIDE :
+        //  case TokenNameGREATER  :
+        //  case TokenNameLESS  :
+    }
+  }
+  protected void consumeTypeDeclarations() {
+    // TypeDeclarations ::= TypeDeclarations TypeDeclaration
+    concatNodeLists();
+  }
+  protected void consumeTypeDeclarationsopt() {
+    // TypeDeclarationsopt ::= TypeDeclarations
+    int length;
+    if ((length = astLengthStack[astLengthPtr--]) != 0) {
+      astPtr -= length;
+      System.arraycopy(astStack, astPtr + 1, compilationUnit.types = new TypeDeclaration[length], 0, length);
+    }
+  }
+  protected void consumeTypeImportOnDemandDeclaration() {
+    // TypeImportOnDemandDeclaration ::= TypeImportOnDemandDeclarationName ';'
+
+    ImportReference impt = (ImportReference) astStack[astPtr];
+    // flush annotations defined prior to import statements
+    impt.declarationEnd = endStatementPosition;
+    impt.declarationSourceEnd = this.flushAnnotationsDefinedPriorTo(impt.declarationSourceEnd);
+
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = impt.declarationSourceEnd + 1;
+      currentElement = currentElement.add(impt, 0);
+      restartRecovery = true;
+      lastIgnoredToken = -1;
+      // used to avoid branching back into the regular automaton
+    }
+  }
+  protected void consumeTypeImportOnDemandDeclarationName() {
+    // TypeImportOnDemandDeclarationName ::= 'import' Name '.' '*'
+    /* push an ImportRef build from the last name 
+    stored in the identifier stack. */
+
+    ImportReference impt;
+    int length;
+    char[][] tokens = new char[length = identifierLengthStack[identifierLengthPtr--]][];
+    identifierPtr -= length;
+    long[] positions = new long[length];
+    System.arraycopy(identifierStack, identifierPtr + 1, tokens, 0, length);
+    System.arraycopy(identifierPositionStack, identifierPtr + 1, positions, 0, length);
+    pushOnAstStack(impt = new ImportReference(tokens, positions, true));
+
+    if (currentToken == TokenNameSEMICOLON) {
+      impt.declarationSourceEnd = scanner.currentPosition - 1;
+    } else {
+      impt.declarationSourceEnd = impt.sourceEnd;
+    }
+    impt.declarationEnd = impt.declarationSourceEnd;
+    //endPosition is just before the ;
+    impt.declarationSourceStart = intStack[intPtr--];
+
+    // recovery
+    if (currentElement != null) {
+      lastCheckPoint = impt.declarationSourceEnd + 1;
+      currentElement = currentElement.add(impt, 0);
+      lastIgnoredToken = -1;
+      restartRecovery = true; // used to avoid branching back into the regular automaton               
+    }
+  }
+  protected void consumeUnaryExpression(int op) {
+    // UnaryExpression ::= '+' PushPosition UnaryExpression
+    // UnaryExpression ::= '-' PushPosition UnaryExpression
+    // UnaryExpressionNotPlusMinus ::= '~' PushPosition UnaryExpression
+    // UnaryExpressionNotPlusMinus ::= '!' PushPosition UnaryExpression
+
+    //optimize the push/pop
+
+    //handle manually the -2147483648 while it is not a real
+    //computation of an - and 2147483648 (notice that 2147483648
+    //is Integer.MAX_VALUE+1.....)
+    //Same for -9223372036854775808L ............
+
+    //intStack have the position of the operator
+
+    Expression r, exp = expressionStack[expressionPtr];
+    if (op == MINUS) {
+      if ((exp instanceof IntLiteral) && (((IntLiteral) exp).mayRepresentMIN_VALUE())) {
+        r = expressionStack[expressionPtr] = new IntLiteralMinValue();
+      } else {
+        if ((exp instanceof LongLiteral) && (((LongLiteral) exp).mayRepresentMIN_VALUE())) {
+          r = expressionStack[expressionPtr] = new LongLiteralMinValue();
+        } else {
+          r = expressionStack[expressionPtr] = new UnaryExpression(exp, op);
+        }
+      }
+    } else {
+      r = expressionStack[expressionPtr] = new UnaryExpression(exp, op);
+    }
+    r.sourceStart = intStack[intPtr--];
+    r.sourceEnd = exp.sourceEnd;
+  }
+  protected void consumeUnaryExpression(int op, boolean post) {
+    // PreIncrementExpression ::= '++' PushPosition UnaryExpression
+    // PreDecrementExpression ::= '--' PushPosition UnaryExpression
+
+    // ++ and -- operators
+    //optimize the push/pop
+
+    //intStack has the position of the operator when prefix
+
+    Expression leftHandSide = expressionStack[expressionPtr];
+    if (leftHandSide instanceof Reference) {
+      // ++foo()++ is unvalid 
+      if (post) {
+        expressionStack[expressionPtr] = new PostfixExpression(leftHandSide, IntLiteral.One, op, endStatementPosition);
+      } else {
+        expressionStack[expressionPtr] = new PrefixExpression(leftHandSide, IntLiteral.One, op, intStack[intPtr--]);
+      }
+    } else {
+      //the ++ or the -- is NOT taken into account if code gen proceeds
+      if (!post) {
+        intPtr--;
+      }
+      problemReporter().invalidUnaryExpression(leftHandSide);
+    }
+  }
+  protected void consumeVariableDeclarators() {
+    // VariableDeclarators ::= VariableDeclarators ',' VariableDeclarator
+    optimizedConcatNodeLists();
+  }
+  protected void consumeVariableInitializers() {
+    // VariableInitializers ::= VariableInitializers ',' VariableInitializer
+    concatExpressionLists();
+  }
+  protected TypeReference copyDims(TypeReference typeRef, int dim) {
+    return typeRef.copyDims(dim);
+  }
+  protected FieldDeclaration createFieldDeclaration(Expression initialization, char[] name, int sourceStart, int sourceEnd) {
+    return new FieldDeclaration(null, name, sourceStart, sourceEnd);
+  }
+
+  protected LocalDeclaration createLocalDeclaration(Expression initialization, char[] name, int sourceStart, int sourceEnd) {
+    return new LocalDeclaration(null, name, sourceStart, sourceEnd);
+  }
+
+  public CompilationUnitDeclaration dietParse(ICompilationUnit sourceUnit, CompilationResult compilationResult) {
+
+    CompilationUnitDeclaration parsedUnit;
+    boolean old = diet;
+    try {
+      diet = true;
+      parsedUnit = parse(sourceUnit, compilationResult);
+    } finally {
+      diet = old;
+    }
+    return parsedUnit;
+  }
+  protected void dispatchDeclarationInto(int length) {
+    /* they are length on astStack that should go into
+       methods fields constructors lists of the typeDecl
+    
+       Return if there is a constructor declaration in the methods declaration */
+
+    // Looks for the size of each array . 
+
+    if (length == 0)
+      return;
+    int[] flag = new int[length + 1]; //plus one -- see <HERE>
+    int size1 = 0, size2 = 0, size3 = 0;
+    for (int i = length - 1; i >= 0; i--) {
+      AstNode astNode = astStack[astPtr--];
+      if (astNode instanceof AbstractMethodDeclaration) {
+        //methods and constructors have been regrouped into one single list
+        flag[i] = 3;
+        size2++;
+      } else {
+        if (astNode instanceof TypeDeclaration) {
+          flag[i] = 4;
+          size3++;
+        } else {
+          //field
+          flag[i] = 1;
+          size1++;
+        }
+      }
+    }
+
+    //arrays creation
+    TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
+    if (size1 != 0)
+      typeDecl.fields = new FieldDeclaration[size1];
+    if (size2 != 0)
+      typeDecl.methods = new AbstractMethodDeclaration[size2];
+    if (size3 != 0)
+      typeDecl.memberTypes = new MemberTypeDeclaration[size3];
+
+    //arrays fill up
+    size1 = size2 = size3 = 0;
+    int flagI = flag[0], start = 0;
+    int length2;
+    for (int end = 0; end <= length; end++) //<HERE> the plus one allows to 
+      {
+      if (flagI != flag[end]) //treat the last element as a ended flag.....
+        { //array copy
+        switch (flagI) {
+          case 1 :
+            size1 += (length2 = end - start);
+            System.arraycopy(astStack, astPtr + start + 1, typeDecl.fields, size1 - length2, length2);
+            break;
+          case 3 :
+            size2 += (length2 = end - start);
+            System.arraycopy(astStack, astPtr + start + 1, typeDecl.methods, size2 - length2, length2);
+            break;
+          case 4 :
+            size3 += (length2 = end - start);
+            System.arraycopy(astStack, astPtr + start + 1, typeDecl.memberTypes, size3 - length2, length2);
+            break;
+        };
+        flagI = flag[start = end];
+      }
+    }
+
+    if (typeDecl.memberTypes != null) {
+      for (int i = typeDecl.memberTypes.length - 1; i >= 0; i--) {
+        typeDecl.memberTypes[i].enclosingType = typeDecl;
+      }
+    }
+  }
+  protected CompilationUnitDeclaration endParse(int act) {
+
+    this.lastAct = act;
+
+    if (currentElement != null) {
+      currentElement.topElement().updateParseTree();
+      if (VERBOSE_RECOVERY) {
+        System.out.print(Util.bind("parser.syntaxRecovery")); //$NON-NLS-1$
+        System.out.println("--------------------------"); //$NON-NLS-1$
+        System.out.println(compilationUnit);
+        System.out.println("----------------------------------"); //$NON-NLS-1$
+      }
+    } else {
+      if (diet & VERBOSE_RECOVERY) {
+        System.out.print(Util.bind("parser.regularParse")); //$NON-NLS-1$
+        System.out.println("--------------------------"); //$NON-NLS-1$
+        System.out.println(compilationUnit);
+        System.out.println("----------------------------------"); //$NON-NLS-1$
+      }
+    }
+    if (scanner.recordLineSeparator) {
+      compilationUnit.compilationResult.lineSeparatorPositions = scanner.getLineEnds();
+    }
+    return compilationUnit;
+  }
+  /*
+   * Flush annotations defined prior to a given positions.
+   *
+   * Note: annotations are stacked in syntactical order
+   *
+   * Either answer given <position>, or the end position of a comment line 
+   * immediately following the <position> (same line)
+   *
+   * e.g.
+   * void foo(){
+   * } // end of method foo
+   */
+
+  public int flushAnnotationsDefinedPriorTo(int position) {
+
+    int lastAnnotationIndex = scanner.commentPtr;
+    if (lastAnnotationIndex < 0)
+      return position; // no comment
+
+    // compute the index of the first obsolete comment
+    int index = lastAnnotationIndex;
+    int validCount = 0;
+    while (index >= 0) {
+      int commentEnd = scanner.commentStops[index];
+      if (commentEnd < 0)
+        commentEnd = -commentEnd; // negative end position for non-javadoc comments
+      if (commentEnd <= position) {
+        break;
+      }
+      index--;
+      validCount++;
+    }
+    // if the source at <position> is immediately followed by a line comment, then
+    // flush this comment and shift <position> to the comment end.
+    if (validCount > 0) {
+      int immediateCommentEnd = -scanner.commentStops[index + 1]; //non-javadoc comment end positions are negative
+      if (immediateCommentEnd > 0) { // only tolerating non-javadoc comments
+        // is there any line break until the end of the immediate comment ? (thus only tolerating line comment)
+        immediateCommentEnd--; // comment end in one char too far
+        if (scanner.getLineNumber(position) == scanner.getLineNumber(immediateCommentEnd)) {
+          position = immediateCommentEnd;
+          validCount--; // flush this comment
+          index++;
+        }
+      }
+    }
+    // position can be located in the middle of a line break
+    // this is a bug on Windows platform only.
+    // http://dev.eclipse.org/bugs/show_bug.cgi?id=10557
+    char[] source = scanner.source;
+
+    if ((position < source.length)
+      && (source[position] == '\r')
+      && ((position + 1) < source.length)
+      && (source[position + 1] == '\n')) {
+      position++;
+    }
+    if (index < 0)
+      return position; // no obsolete comment
+
+    if (validCount > 0) { // move valid comment infos, overriding obsolete comment infos
+      System.arraycopy(scanner.commentStarts, index + 1, scanner.commentStarts, 0, validCount);
+      System.arraycopy(scanner.commentStops, index + 1, scanner.commentStops, 0, validCount);
+    }
+    scanner.commentPtr = validCount - 1;
+    return position;
+  }
+  public final int getFirstToken() {
+    // the first token is a virtual token that
+    // allows the parser to parse several goals
+    // even if they aren't LALR(1)....
+    // Goal ::= '++' CompilationUnit
+    // Goal ::= '--' MethodBody
+    // Goal ::= '==' ConstructorBody
+    // -- Initializer
+    // Goal ::= '>>' StaticInitializer
+    // Goal ::= '>>' Block
+    // -- error recovery
+    // Goal ::= '>>>' Headers
+    // Goal ::= '*' BlockStatements
+    // Goal ::= '*' MethodPushModifiersHeader
+    // -- JDOM
+    // Goal ::= '&&' FieldDeclaration
+    // Goal ::= '||' ImportDeclaration
+    // Goal ::= '?' PackageDeclaration
+    // Goal ::= '+' TypeDeclaration
+    // Goal ::= '/' GenericMethodDeclaration
+    // Goal ::= '&' ClassBodyDeclaration
+    // -- code snippet
+    // Goal ::= '%' Expression
+    // -- completion parser
+    // Goal ::= '!' ConstructorBlockStatementsopt
+    // Goal ::= '~' BlockStatementsopt
+
+    return firstToken;
+  }
+  /*
+   * Answer back an array of sourceStart/sourceEnd positions of the available JavaDoc comments.
+   * The array is a flattened structure: 2*n entries with consecutives start and end positions.
+   *
+   * If no JavaDoc is available, then null is answered instead of an empty array.
+   *
+   * e.g. { 10, 20, 25, 45 }  --> javadoc1 from 10 to 20, javadoc2 from 25 to 45
+   */
+  public int[] getJavaDocPositions() {
+
+    int javadocCount = 0;
+    for (int i = 0, max = scanner.commentPtr; i <= max; i++) {
+      // javadoc only (non javadoc comment have negative end positions.)
+      if (scanner.commentStops[i] > 0) {
+        javadocCount++;
+      }
+    }
+    if (javadocCount == 0)
+      return null;
+
+    int[] positions = new int[2 * javadocCount];
+    int index = 0;
+    for (int i = 0, max = scanner.commentPtr; i <= max; i++) {
+      // javadoc only (non javadoc comment have negative end positions.)
+      if (scanner.commentStops[i] > 0) {
+        positions[index++] = scanner.commentStarts[i];
+        positions[index++] = scanner.commentStops[i] - 1; //stop is one over                   
+      }
+    }
+    return positions;
+  }
+  protected void getMethodBodies(CompilationUnitDeclaration unit) {
+    //fill the methods bodies in order for the code to be generated
+
+    if (unit == null)
+      return;
+
+    if (unit.ignoreMethodBodies) {
+      unit.ignoreFurtherInvestigation = true;
+      return;
+      // if initial diet parse did not work, no need to dig into method bodies.
+    }
+
+    //real parse of the method....
+    this.scanner.setSource(unit.compilationResult.compilationUnit.getContents());
+    if (unit.types != null) {
+      for (int i = unit.types.length; --i >= 0;)
+        unit.types[i].parseMethod(this, unit);
+    }
+  }
+  protected TypeReference getTypeReference(int dim) { /* build a Reference on a variable that may be qualified or not
+  This variable is a type reference and dim will be its dimensions*/
+
+    int length;
+    TypeReference ref;
+    if ((length = identifierLengthStack[identifierLengthPtr--]) == 1) {
+      // single variable reference
+      if (dim == 0) {
+        ref = new SingleTypeReference(identifierStack[identifierPtr], identifierPositionStack[identifierPtr--]);
+      } else {
+        ref = new ArrayTypeReference(identifierStack[identifierPtr], dim, identifierPositionStack[identifierPtr--]);
+        ref.sourceEnd = endPosition;
+      }
+    } else {
+      if (length < 0) { //flag for precompiled type reference on base types
+        ref = TypeReference.baseTypeReference(-length, dim);
+        ref.sourceStart = intStack[intPtr--];
+        if (dim == 0) {
+          ref.sourceEnd = intStack[intPtr--];
+        } else {
+          intPtr--;
+          ref.sourceEnd = endPosition;
+        }
+      } else { //Qualified variable reference
+        char[][] tokens = new char[length][];
+        identifierPtr -= length;
+        long[] positions = new long[length];
+        System.arraycopy(identifierStack, identifierPtr + 1, tokens, 0, length);
+        System.arraycopy(identifierPositionStack, identifierPtr + 1, positions, 0, length);
+        if (dim == 0) {
+          ref = new QualifiedTypeReference(tokens, positions);
+        } else {
+          ref = new ArrayQualifiedTypeReference(tokens, dim, positions);
+          ref.sourceEnd = endPosition;
+        }
+      }
+    };
+    return ref;
+  }
+  protected Expression getTypeReference(Expression exp) {
+
+    exp.bits &= ~AstNode.RestrictiveFlagMASK;
+    exp.bits |= TYPE;
+    return exp;
+  }
+  protected NameReference getUnspecifiedReference() {
+    /* build a (unspecified) NameReference which may be qualified*/
+
+    int length;
+    NameReference ref;
+    if ((length = identifierLengthStack[identifierLengthPtr--]) == 1)
+      // single variable reference
+      ref = new SingleNameReference(identifierStack[identifierPtr], identifierPositionStack[identifierPtr--]);
+    else
+      //Qualified variable reference
+      {
+      char[][] tokens = new char[length][];
+      identifierPtr -= length;
+      System.arraycopy(identifierStack, identifierPtr + 1, tokens, 0, length);
+        ref = new QualifiedNameReference(tokens, (int) (identifierPositionStack[identifierPtr + 1] >> 32), // sourceStart
+   (int) identifierPositionStack[identifierPtr + length]); // sourceEnd
+    };
+    return ref;
+  }
+  protected NameReference getUnspecifiedReferenceOptimized() {
+    /* build a (unspecified) NameReference which may be qualified
+    The optimization occurs for qualified reference while we are
+    certain in this case the last item of the qualified name is
+    a field access. This optimization is IMPORTANT while it results
+    that when a NameReference is build, the type checker should always
+    look for that it is not a type reference */
+
+    int length;
+    NameReference ref;
+    if ((length = identifierLengthStack[identifierLengthPtr--]) == 1) {
+      // single variable reference
+      ref = new SingleNameReference(identifierStack[identifierPtr], identifierPositionStack[identifierPtr--]);
+      ref.bits &= ~AstNode.RestrictiveFlagMASK;
+      ref.bits |= LOCAL | FIELD;
+      return ref;
+    }
+
+    //Qualified-variable-reference
+    //In fact it is variable-reference DOT field-ref , but it would result in a type
+    //conflict tha can be only reduce by making a superclass (or inetrface ) between
+    //nameReference and FiledReference or putting FieldReference under NameReference
+    //or else..........This optimisation is not really relevant so just leave as it is
+
+    char[][] tokens = new char[length][];
+    identifierPtr -= length;
+    System.arraycopy(identifierStack, identifierPtr + 1, tokens, 0, length);
+      ref = new QualifiedNameReference(tokens, (int) (identifierPositionStack[identifierPtr + 1] >> 32), // sourceStart
+   (int) identifierPositionStack[identifierPtr + length]); // sourceEnd
+    ref.bits &= ~AstNode.RestrictiveFlagMASK;
+    ref.bits |= LOCAL | FIELD;
+    return ref;
+  }
+  public void goForBlockStatementsOrMethodHeaders() {
+    //tells the scanner to go for block statements or method headers parsing 
+
+    firstToken = TokenNameMULTIPLY;
+    scanner.recordLineSeparator = false;
+  }
+  public void goForClassBodyDeclarations() {
+    //tells the scanner to go for any body declarations parsing
+
+    firstToken = TokenNameAND;
+    scanner.recordLineSeparator = true;
+  }
+  public void goForCompilationUnit() {
+    //tells the scanner to go for compilation unit parsing
+
+    firstToken = TokenNamePLUS_PLUS;
+    scanner.linePtr = -1;
+    scanner.recordLineSeparator = true;
+    scanner.currentLine = null;
+    scanner.lines = new ArrayList();
+  }
+  public void goForConstructorBody() {
+    //tells the scanner to go for compilation unit parsing
+
+    firstToken = TokenNameEQUAL_EQUAL;
+    scanner.recordLineSeparator = false;
+  }
+  public void goForExpression() {
+    //tells the scanner to go for an expression parsing
+
+    firstToken = TokenNameREMAINDER;
+    scanner.recordLineSeparator = false;
+  }
+  public void goForFieldDeclaration() {
+    //tells the scanner to go for field declaration parsing
+
+    firstToken = TokenNameAND_AND;
+    scanner.recordLineSeparator = true;
+  }
+  public void goForGenericMethodDeclaration() {
+    //tells the scanner to go for generic method declarations parsing
+
+    firstToken = TokenNameDIVIDE;
+    scanner.recordLineSeparator = true;
+  }
+  public void goForHeaders() {
+    //tells the scanner to go for headers only parsing
+
+    firstToken = TokenNameUNSIGNED_RIGHT_SHIFT;
+    scanner.recordLineSeparator = true;
+  }
+  public void goForImportDeclaration() {
+    //tells the scanner to go for import declaration parsing
+
+    firstToken = TokenNameOR_OR;
+    scanner.recordLineSeparator = true;
+  }
+  public void goForInitializer() {
+    //tells the scanner to go for initializer parsing
+
+    firstToken = TokenNameRIGHT_SHIFT;
+    scanner.recordLineSeparator = false;
+  }
+  public void goForMethodBody() {
+    //tells the scanner to go for method body parsing
+
+    firstToken = TokenNameMINUS_MINUS;
+    scanner.recordLineSeparator = false;
+  }
+  public void goForPackageDeclaration() {
+    //tells the scanner to go for package declaration parsing
+
+    firstToken = TokenNameQUESTION;
+    scanner.recordLineSeparator = true;
+  }
+  public void goForTypeDeclaration() {
+    //tells the scanner to go for type (interface or class) declaration parsing
+
+    firstToken = TokenNamePLUS;
+    scanner.recordLineSeparator = true;
+  }
+  public final static void grammar() {
+    /*
+    --main options
+    %options ACTION, AN=JavaAction.java, GP=java, 
+    %options FILE-PREFIX=java, ESCAPE=$, PREFIX=TokenName, OUTPUT-SIZE=125 ,
+    %options NOGOTO-DEFAULT, SINGLE-PRODUCTIONS, LALR=1 , TABLE=TIME , 
+    
+    --error recovering options.....
+    %options ERROR_MAPS 
+    
+    --grammar understanding options
+    %options first follow
+    %options TRACE=FULL ,
+    %options VERBOSE
+    
+    --Usefull macros helping reading/writing semantic actions
+    $Define 
+    $putCase 
+    /.    case $rule_number : // System.out.println("$rule_text");  
+                  ./
+    
+    $break
+    /. 
+                       break ;
+    ./
+    
+    -- here it starts really ------------------------------------------
+    $Terminals
+    
+       Identifier
+    
+       abstract assert boolean break byte case catch char class 
+       continue default do double else extends false final finally float
+       for if implements import instanceof int
+       interface long native new null package private
+       protected public return short static strictfp super switch
+       synchronized this throw throws transient true try void
+       volatile while
+    
+       IntegerLiteral
+       LongLiteral
+       FloatingPointLiteral
+       DoubleLiteral
+       CharacterLiteral
+       StringLiteral
+    
+       PLUS_PLUS
+       MINUS_MINUS
+       EQUAL_EQUAL
+       LESS_EQUAL
+       GREATER_EQUAL
+       NOT_EQUAL
+       LEFT_SHIFT
+       RIGHT_SHIFT
+       UNSIGNED_RIGHT_SHIFT
+       PLUS_EQUAL
+       MINUS_EQUAL
+       MULTIPLY_EQUAL
+       DIVIDE_EQUAL
+       AND_EQUAL
+       OR_EQUAL
+       XOR_EQUAL
+       REMAINDER_EQUAL
+       LEFT_SHIFT_EQUAL
+       RIGHT_SHIFT_EQUAL
+       UNSIGNED_RIGHT_SHIFT_EQUAL
+       OR_OR
+       AND_AND
+       PLUS
+       MINUS
+       NOT
+       REMAINDER
+       XOR
+       AND
+       MULTIPLY
+       OR
+       TWIDDLE
+       DIVIDE
+       GREATER
+       LESS
+       LPAREN
+       RPAREN
+       LBRACE
+       RBRACE
+       LBRACKET
+       RBRACKET
+       SEMICOLON
+       QUESTION
+       COLON
+       COMMA
+       DOT
+       EQUAL
+    
+    --    BodyMarker
+    
+    $Alias
+    
+       '++'   ::= PLUS_PLUS
+       '--'   ::= MINUS_MINUS
+       '=='   ::= EQUAL_EQUAL
+       '<='   ::= LESS_EQUAL
+       '>='   ::= GREATER_EQUAL
+       '!='   ::= NOT_EQUAL
+       '<<'   ::= LEFT_SHIFT
+       '>>'   ::= RIGHT_SHIFT
+       '>>>'  ::= UNSIGNED_RIGHT_SHIFT
+       '+='   ::= PLUS_EQUAL
+       '-='   ::= MINUS_EQUAL
+       '*='   ::= MULTIPLY_EQUAL
+       '/='   ::= DIVIDE_EQUAL
+       '&='   ::= AND_EQUAL
+       '|='   ::= OR_EQUAL
+       '^='   ::= XOR_EQUAL
+       '%='   ::= REMAINDER_EQUAL
+       '<<='  ::= LEFT_SHIFT_EQUAL
+       '>>='  ::= RIGHT_SHIFT_EQUAL
+       '>>>=' ::= UNSIGNED_RIGHT_SHIFT_EQUAL
+       '||'   ::= OR_OR
+       '&&'   ::= AND_AND
+    
+       '+'    ::= PLUS
+       '-'    ::= MINUS
+       '!'    ::= NOT
+       '%'    ::= REMAINDER
+       '^'    ::= XOR
+       '&'    ::= AND
+       '*'    ::= MULTIPLY
+       '|'    ::= OR
+       '~'    ::= TWIDDLE
+       '/'    ::= DIVIDE
+       '>'    ::= GREATER
+       '<'    ::= LESS
+       '('    ::= LPAREN
+       ')'    ::= RPAREN
+       '{'    ::= LBRACE
+       '}'    ::= RBRACE
+       '['    ::= LBRACKET
+       ']'    ::= RBRACKET
+       ';'    ::= SEMICOLON
+       '?'    ::= QUESTION
+       ':'    ::= COLON
+       ','    ::= COMMA
+       '.'    ::= DOT
+       '='    ::= EQUAL
+       
+    $Start
+       Goal
+    
+    $Rules
+    
+    /. // This method is part of an automatic generation : do NOT edit-modify  
+    protected void consumeRule(int act) {
+      switch ( act ) {
+    ./
+    
+    
+    
+    Goal ::= '++' CompilationUnit
+    Goal ::= '--' MethodBody
+    Goal ::= '==' ConstructorBody
+    -- Initializer
+    Goal ::= '>>' StaticInitializer
+    Goal ::= '>>' Initializer
+    -- error recovery
+    Goal ::= '>>>' Headers
+    Goal ::= '*' BlockStatements
+    Goal ::= '*' MethodPushModifiersHeader
+    Goal ::= '*' CatchHeader
+    -- JDOM
+    Goal ::= '&&' FieldDeclaration
+    Goal ::= '||' ImportDeclaration
+    Goal ::= '?' PackageDeclaration
+    Goal ::= '+' TypeDeclaration
+    Goal ::= '/' GenericMethodDeclaration
+    Goal ::= '&' ClassBodyDeclaration
+    -- code snippet
+    Goal ::= '%' Expression
+    -- completion parser
+    Goal ::= '!' ConstructorBlockStatementsopt
+    Goal ::= '~' BlockStatementsopt
+    
+    Literal -> IntegerLiteral
+    Literal -> LongLiteral
+    Literal -> FloatingPointLiteral
+    Literal -> DoubleLiteral
+    Literal -> CharacterLiteral
+    Literal -> StringLiteral
+    Literal -> null
+    Literal -> BooleanLiteral
+    BooleanLiteral -> true
+    BooleanLiteral -> false
+    
+    -------------------------------------------------------------
+    -------------------------------------------------------------
+    --a Type results in both a push of its dimension(s) and its name(s).
+    
+    Type ::= PrimitiveType
+     /.$putCase consumePrimitiveType(); $break ./
+    Type -> ReferenceType
+    
+    PrimitiveType -> NumericType
+    NumericType -> IntegralType
+    NumericType -> FloatingPointType
+    
+    PrimitiveType -> 'boolean'
+    PrimitiveType -> 'void'
+    IntegralType -> 'byte'
+    IntegralType -> 'short'
+    IntegralType -> 'int'
+    IntegralType -> 'long'
+    IntegralType -> 'char'
+    FloatingPointType -> 'float'
+    FloatingPointType -> 'double'
+    
+    ReferenceType ::= ClassOrInterfaceType
+    /.$putCase consumeReferenceType();  $break ./
+    ReferenceType -> ArrayType -- here a push of dimensions is done, that explains the two previous push 0
+    
+    ClassOrInterfaceType -> Name
+    
+    --
+    -- These rules have been rewritten to avoid some conflicts introduced
+    -- by adding the 1.1 features
+    --
+    -- ArrayType ::= PrimitiveType '[' ']'
+    -- ArrayType ::= Name '[' ']'
+    -- ArrayType ::= ArrayType '[' ']'
+    --
+    
+    ArrayType ::= PrimitiveType Dims
+    ArrayType ::= Name Dims
+    
+    ClassType -> ClassOrInterfaceType
+    
+    
+    --------------------------------------------------------------
+    --------------------------------------------------------------
+    
+    Name -> SimpleName
+    Name -> QualifiedName
+    
+    SimpleName -> 'Identifier'
+    
+    QualifiedName ::= Name '.' SimpleName 
+    /.$putCase consumeQualifiedName(); $break ./
+    
+    CompilationUnit ::= EnterCompilationUnit PackageDeclarationopt ImportDeclarationsopt TypeDeclarationsopt
+    /.$putCase consumeCompilationUnit(); $break ./
+    
+    EnterCompilationUnit ::= $empty
+    /.$putCase consumeEnterCompilationUnit(); $break ./
+    
+    Headers -> Header
+    Headers ::= Headers Header
+    
+    Header -> ImportDeclaration
+    Header -> PackageDeclaration
+    Header -> ClassHeader
+    Header -> InterfaceHeader
+    Header -> StaticInitializer
+    Header -> MethodHeader
+    Header -> ConstructorHeader
+    Header -> FieldDeclaration
+    Header -> AllocationHeader
+    
+    CatchHeader ::= 'catch' '(' FormalParameter ')' '{'
+    /.$putCase consumeCatchHeader(); $break ./
+    
+    ImportDeclarations -> ImportDeclaration
+    ImportDeclarations ::= ImportDeclarations ImportDeclaration 
+    /.$putCase consumeImportDeclarations(); $break ./
+    
+    TypeDeclarations -> TypeDeclaration
+    TypeDeclarations ::= TypeDeclarations TypeDeclaration
+    /.$putCase consumeTypeDeclarations(); $break ./
+    
+    PackageDeclaration ::= PackageDeclarationName ';'
+    /.$putCase  consumePackageDeclaration(); $break ./
+    
+    PackageDeclarationName ::= 'package' Name
+    /.$putCase  consumePackageDeclarationName(); $break ./
+    
+    ImportDeclaration -> SingleTypeImportDeclaration
+    ImportDeclaration -> TypeImportOnDemandDeclaration
+    
+    SingleTypeImportDeclaration ::= SingleTypeImportDeclarationName ';'
+    /.$putCase consumeSingleTypeImportDeclaration(); $break ./
+                         
+    SingleTypeImportDeclarationName ::= 'import' Name
+    /.$putCase consumeSingleTypeImportDeclarationName(); $break ./
+                         
+    TypeImportOnDemandDeclaration ::= TypeImportOnDemandDeclarationName ';'
+    /.$putCase consumeTypeImportOnDemandDeclaration(); $break ./
+    
+    TypeImportOnDemandDeclarationName ::= 'import' Name '.' '*'
+    /.$putCase consumeTypeImportOnDemandDeclarationName(); $break ./
+    
+    TypeDeclaration -> ClassDeclaration
+    TypeDeclaration -> InterfaceDeclaration
+    -- this declaration in part of a list od declaration and we will
+    -- use and optimized list length calculation process 
+    -- thus we decrement the number while it will be incremend.....
+    TypeDeclaration ::= ';' 
+    /. $putCase consumeEmptyTypeDeclaration(); $break ./
+    
+    --18.7 Only in the LALR(1) Grammar
+    
+    Modifiers ::= Modifier
+    Modifiers ::= Modifiers Modifier
+    
+    Modifier -> 'public' 
+    Modifier -> 'protected'
+    Modifier -> 'private'
+    Modifier -> 'static'
+    Modifier -> 'abstract'
+    Modifier -> 'final'
+    Modifier -> 'native'
+    Modifier -> 'synchronized'
+    Modifier -> 'transient'
+    Modifier -> 'volatile'
+    Modifier -> 'strictfp'
+    
+    --18.8 Productions from 8: Class Declarations
+    --ClassModifier ::=
+    --      'abstract'
+    --    | 'final'
+    --    | 'public'
+    --18.8.1 Productions from 8.1: Class Declarations
+    
+    ClassDeclaration ::= ClassHeader ClassBody
+    /.$putCase consumeClassDeclaration(); $break ./
+    
+    ClassHeader ::= ClassHeaderName ClassHeaderExtendsopt ClassHeaderImplementsopt
+    /.$putCase consumeClassHeader(); $break ./
+    
+    ClassHeaderName ::= Modifiersopt 'class' 'Identifier'
+    /.$putCase consumeClassHeaderName(); $break ./
+    
+    ClassHeaderExtends ::= 'extends' ClassType
+    /.$putCase consumeClassHeaderExtends(); $break ./
+    
+    ClassHeaderImplements ::= 'implements' InterfaceTypeList
+    /.$putCase consumeClassHeaderImplements(); $break ./
+    
+    InterfaceTypeList -> InterfaceType
+    InterfaceTypeList ::= InterfaceTypeList ',' InterfaceType
+    /.$putCase consumeInterfaceTypeList(); $break ./
+    
+    InterfaceType ::= ClassOrInterfaceType
+    /.$putCase consumeInterfaceType(); $break ./
+    
+    ClassBody ::= '{' ClassBodyDeclarationsopt '}'
+    
+    ClassBodyDeclarations ::= ClassBodyDeclaration
+    ClassBodyDeclarations ::= ClassBodyDeclarations ClassBodyDeclaration
+    /.$putCase consumeClassBodyDeclarations(); $break ./
+    
+    ClassBodyDeclaration -> ClassMemberDeclaration
+    ClassBodyDeclaration -> StaticInitializer
+    ClassBodyDeclaration -> ConstructorDeclaration
+    --1.1 feature
+    ClassBodyDeclaration ::= Diet NestedMethod Block
+    /.$putCase consumeClassBodyDeclaration(); $break ./
+    Diet ::= $empty
+    /.$putCase consumeDiet(); $break./
+    
+    Initializer ::= Diet NestedMethod Block
+    /.$putCase consumeClassBodyDeclaration(); $break ./
+    
+    ClassMemberDeclaration -> FieldDeclaration
+    ClassMemberDeclaration -> MethodDeclaration
+    --1.1 feature
+    ClassMemberDeclaration -> ClassDeclaration
+    --1.1 feature
+    ClassMemberDeclaration -> InterfaceDeclaration
+    
+    -- Empty declarations are not valid Java ClassMemberDeclarations.
+    -- However, since the current (2/14/97) Java compiler accepts them 
+    -- (in fact, some of the official tests contain this erroneous
+    -- syntax)
+    
+    GenericMethodDeclaration -> MethodDeclaration
+    GenericMethodDeclaration -> ConstructorDeclaration
+    
+    ClassMemberDeclaration ::= ';'
+    /.$putCase consumeEmptyClassMemberDeclaration(); $break./
+    
+    --18.8.2 Productions from 8.3: Field Declarations
+    --VariableModifier ::=
+    --      'public'
+    --    | 'protected'
+    --    | 'private'
+    --    | 'static'
+    --    | 'final'
+    --    | 'transient'
+    --    | 'volatile'
+    
+    FieldDeclaration ::= Modifiersopt Type VariableDeclarators ';'
+    /.$putCase consumeFieldDeclaration(); $break ./
+    
+    VariableDeclarators -> VariableDeclarator 
+    VariableDeclarators ::= VariableDeclarators ',' VariableDeclarator
+    /.$putCase consumeVariableDeclarators(); $break ./
+    
+    VariableDeclarator ::= VariableDeclaratorId EnterVariable ExitVariableWithoutInitialization
+    
+    VariableDeclarator ::= VariableDeclaratorId EnterVariable '=' ForceNoDiet VariableInitializer RestoreDiet ExitVariableWithInitialization
+    
+    EnterVariable ::= $empty
+    /.$putCase consumeEnterVariable(); $break ./
+    
+    ExitVariableWithInitialization ::= $empty
+    /.$putCase consumeExitVariableWithInitialization(); $break ./
+    
+    ExitVariableWithoutInitialization ::= $empty
+    /.$putCase consumeExitVariableWithoutInitialization(); $break ./
+    
+    ForceNoDiet ::= $empty
+    /.$putCase consumeForceNoDiet(); $break ./
+    RestoreDiet ::= $empty
+    /.$putCase consumeRestoreDiet(); $break ./
+    
+    VariableDeclaratorId ::= 'Identifier' Dimsopt
+    
+    VariableInitializer -> Expression
+    VariableInitializer -> ArrayInitializer
+    
+    --18.8.3 Productions from 8.4: Method Declarations
+    --MethodModifier ::=
+    --      'public'
+    --    | 'protected'
+    --    | 'private'
+    --    | 'static'
+    --    | 'abstract'
+    --    | 'final'
+    --    | 'native'
+    --    | 'synchronized'
+    --
+    
+    MethodDeclaration -> AbstractMethodDeclaration
+    MethodDeclaration ::= MethodHeader MethodBody 
+    /.$putCase // set to true to consume a method with a body
+      consumeMethodDeclaration(true);  $break ./
+    
+    AbstractMethodDeclaration ::= MethodHeader ';'
+    /.$putCase // set to false to consume a method without body
+      consumeMethodDeclaration(false); $break ./
+    
+    MethodHeader ::= MethodHeaderName MethodHeaderParameters MethodHeaderExtendedDims MethodHeaderThrowsClauseopt
+    /.$putCase consumeMethodHeader(); $break ./
+    
+    MethodPushModifiersHeader ::= MethodPushModifiersHeaderName MethodHeaderParameters MethodHeaderExtendedDims MethodHeaderThrowsClauseopt
+    /.$putCase consumeMethodHeader(); $break ./
+    
+    MethodPushModifiersHeaderName ::= Modifiers Type PushModifiers 'Identifier' '(' 
+    /.$putCase consumeMethodPushModifiersHeaderName(); $break ./
+    
+    MethodPushModifiersHeaderName ::= Type PushModifiers 'Identifier' '(' 
+    /.$putCase consumeMethodPushModifiersHeaderName(); $break ./
+    
+    MethodHeaderName ::= Modifiersopt Type 'Identifier' '('
+    /.$putCase consumeMethodHeaderName(); $break ./
+    
+    MethodHeaderParameters ::= FormalParameterListopt ')'
+    /.$putCase consumeMethodHeaderParameters(); $break ./
+    
+    MethodHeaderExtendedDims ::= Dimsopt
+    /.$putCase consumeMethodHeaderExtendedDims(); $break ./
+    
+    MethodHeaderThrowsClause ::= 'throws' ClassTypeList
+    /.$putCase consumeMethodHeaderThrowsClause(); $break ./
+    
+    ConstructorHeader ::= ConstructorHeaderName MethodHeaderParameters MethodHeaderThrowsClauseopt
+    /.$putCase consumeConstructorHeader(); $break ./
+    
+    ConstructorHeaderName ::=  Modifiersopt 'Identifier' '('
+    /.$putCase consumeConstructorHeaderName(); $break ./
+    
+    FormalParameterList -> FormalParameter
+    FormalParameterList ::= FormalParameterList ',' FormalParameter
+    /.$putCase consumeFormalParameterList(); $break ./
+    
+    --1.1 feature
+    FormalParameter ::= Modifiersopt Type VariableDeclaratorId
+    /.$putCase // the boolean is used to know if the modifiers should be reset
+       consumeFormalParameter(); $break ./
+    
+    ClassTypeList -> ClassTypeElt
+    ClassTypeList ::= ClassTypeList ',' ClassTypeElt
+    /.$putCase consumeClassTypeList(); $break ./
+    
+    ClassTypeElt ::= ClassType
+    /.$putCase consumeClassTypeElt(); $break ./
+    
+    
+    MethodBody ::= NestedMethod '{' BlockStatementsopt '}' 
+    /.$putCase consumeMethodBody(); $break ./
+    
+    NestedMethod ::= $empty
+    /.$putCase consumeNestedMethod(); $break ./
+    
+    --18.8.4 Productions from 8.5: Static Initializers
+    
+    StaticInitializer ::=  StaticOnly Block
+    /.$putCase consumeStaticInitializer(); $break./
+    
+    StaticOnly ::= 'static'
+    /.$putCase consumeStaticOnly(); $break ./
+    
+    --18.8.5 Productions from 8.6: Constructor Declarations
+    --ConstructorModifier ::=
+    --      'public'
+    --    | 'protected'
+    --    | 'private'
+    --
+    --
+    ConstructorDeclaration ::= ConstructorHeader ConstructorBody
+    /.$putCase consumeConstructorDeclaration() ; $break ./ 
+    
+    -- These rules are added to be able to parse constructors with no body
+    ConstructorDeclaration ::= ConstructorHeader ';'
+    /.$putCase consumeInvalidConstructorDeclaration() ; $break ./ 
+    
+    -- the rules ExplicitConstructorInvocationopt has been expanded
+    -- in the rule below in order to make the grammar lalr(1).
+    -- ConstructorBody ::= '{' ExplicitConstructorInvocationopt BlockStatementsopt '}'
+    -- Other inlining has occured into the next rule too....
+    
+    ConstructorBody ::= NestedMethod  '{' ConstructorBlockStatementsopt '}'
+    /.$putCase consumeConstructorBody(); $break ./
+    
+    ConstructorBlockStatementsopt -> BlockStatementsopt
+    
+    ConstructorBlockStatementsopt -> ExplicitConstructorInvocation
+    
+    ConstructorBlockStatementsopt ::= ExplicitConstructorInvocation BlockStatements
+    /.$putCase  consumeConstructorBlockStatements(); $break ./
+    
+    ExplicitConstructorInvocation ::= 'this' '(' ArgumentListopt ')' ';'
+    /.$putCase consumeExplicitConstructorInvocation(0,ExplicitConstructorCall.This); $break ./
+    
+    ExplicitConstructorInvocation ::= 'super' '(' ArgumentListopt ')' ';'
+    /.$putCase consumeExplicitConstructorInvocation(0,ExplicitConstructorCall.Super); $break ./
+    
+    --1.1 feature
+    ExplicitConstructorInvocation ::= Primary '.' 'super' '(' ArgumentListopt ')' ';'
+    /.$putCase consumeExplicitConstructorInvocation(1, ExplicitConstructorCall.Super); $break ./
+    
+    --1.1 feature
+    ExplicitConstructorInvocation ::= Name '.' 'super' '(' ArgumentListopt ')' ';'
+    /.$putCase consumeExplicitConstructorInvocation(2, ExplicitConstructorCall.Super); $break ./
+    
+    --1.1 feature
+    ExplicitConstructorInvocation ::= Primary '.' 'this' '(' ArgumentListopt ')' ';'
+    /.$putCase consumeExplicitConstructorInvocation(1, ExplicitConstructorCall.This); $break ./
+    
+    --1.1 feature
+    ExplicitConstructorInvocation ::= Name '.' 'this' '(' ArgumentListopt ')' ';'
+    /.$putCase consumeExplicitConstructorInvocation(2, ExplicitConstructorCall.This); $break ./
+    
+    --18.9 Productions from 9: Interface Declarations
+    
+    --18.9.1 Productions from 9.1: Interface Declarations
+    --InterfaceModifier ::=
+    --      'public'
+    --    | 'abstract'
+    --
+    InterfaceDeclaration ::= InterfaceHeader InterfaceBody
+    /.$putCase consumeInterfaceDeclaration(); $break ./
+    
+    InterfaceHeader ::= InterfaceHeaderName InterfaceHeaderExtendsopt
+    /.$putCase consumeInterfaceHeader(); $break ./
+    
+    InterfaceHeaderName ::= Modifiersopt 'interface' 'Identifier'
+    /.$putCase consumeInterfaceHeaderName(); $break ./
+    
+    -- This rule will be used to accept inner local interface and then report a relevant error message
+    InvalidInterfaceDeclaration -> InterfaceHeader InterfaceBody
+    
+    InterfaceHeaderExtends ::= 'extends' InterfaceTypeList
+    /.$putCase consumeInterfaceHeaderExtends(); $break ./
+    
+    InterfaceBody ::= '{' InterfaceMemberDeclarationsopt '}' 
+    
+    InterfaceMemberDeclarations -> InterfaceMemberDeclaration
+    InterfaceMemberDeclarations ::= InterfaceMemberDeclarations InterfaceMemberDeclaration
+    /.$putCase consumeInterfaceMemberDeclarations(); $break ./
+    
+    --same as for class members
+    InterfaceMemberDeclaration ::= ';'
+    /.$putCase consumeEmptyInterfaceMemberDeclaration(); $break ./
+    
+    -- This rule is added to be able to parse non abstract method inside interface and then report a relevent error message
+    InvalidMethodDeclaration -> MethodHeader MethodBody
+    
+    InterfaceMemberDeclaration -> ConstantDeclaration
+    InterfaceMemberDeclaration ::= InvalidMethodDeclaration
+    /.$putCase ignoreMethodBody(); $break ./
+    
+    -- These rules are added to be able to parse constructors inside interface and then report a relevent error message
+    InvalidConstructorDeclaration ::= ConstructorHeader ConstructorBody
+    /.$putCase ignoreInvalidConstructorDeclaration(true);  $break ./
+    
+    InvalidConstructorDeclaration ::= ConstructorHeader ';'
+    /.$putCase ignoreInvalidConstructorDeclaration(false);  $break ./
+    
+    InterfaceMemberDeclaration -> AbstractMethodDeclaration
+    InterfaceMemberDeclaration -> InvalidConstructorDeclaration
+     
+    --1.1 feature
+    InterfaceMemberDeclaration -> ClassDeclaration
+    --1.1 feature
+    InterfaceMemberDeclaration -> InterfaceDeclaration
+    
+    ConstantDeclaration -> FieldDeclaration
+    
+    ArrayInitializer ::= '{' ,opt '}'
+    /.$putCase consumeEmptyArrayInitializer(); $break ./
+    ArrayInitializer ::= '{' VariableInitializers '}'
+    /.$putCase consumeArrayInitializer(); $break ./
+    ArrayInitializer ::= '{' VariableInitializers , '}'
+    /.$putCase consumeArrayInitializer(); $break ./
+    
+    VariableInitializers ::= VariableInitializer
+    VariableInitializers ::= VariableInitializers ',' VariableInitializer
+    /.$putCase consumeVariableInitializers(); $break ./
+    
+    Block ::= OpenBlock '{' BlockStatementsopt '}'
+    /.$putCase consumeBlock(); $break ./
+    OpenBlock ::= $empty
+    /.$putCase consumeOpenBlock() ; $break ./
+    
+    BlockStatements -> BlockStatement
+    BlockStatements ::= BlockStatements BlockStatement
+    /.$putCase consumeBlockStatements() ; $break ./
+    
+    BlockStatement -> LocalVariableDeclarationStatement
+    BlockStatement -> Statement
+    --1.1 feature
+    BlockStatement -> ClassDeclaration
+    BlockStatement ::= InvalidInterfaceDeclaration
+    /.$putCase ignoreInterfaceDeclaration(); $break ./
+    
+    LocalVariableDeclarationStatement ::= LocalVariableDeclaration ';'
+    /.$putCase consumeLocalVariableDeclarationStatement(); $break ./
+    
+    LocalVariableDeclaration ::= Type PushModifiers VariableDeclarators
+    /.$putCase consumeLocalVariableDeclaration(); $break ./
+    
+    -- 1.1 feature
+    -- The modifiers part of this rule makes the grammar more permissive. 
+    -- The only modifier here is final. We put Modifiers to allow multiple modifiers
+    -- This will require to check the validity of the modifier
+    
+    LocalVariableDeclaration ::= Modifiers Type PushModifiers VariableDeclarators
+    /.$putCase consumeLocalVariableDeclaration(); $break ./
+    
+    PushModifiers ::= $empty
+    /.$putCase consumePushModifiers(); $break ./
+    
+    Statement -> StatementWithoutTrailingSubstatement
+    Statement -> LabeledStatement
+    Statement -> IfThenStatement
+    Statement -> IfThenElseStatement
+    Statement -> WhileStatement
+    Statement -> ForStatement
+    
+    StatementNoShortIf -> StatementWithoutTrailingSubstatement
+    StatementNoShortIf -> LabeledStatementNoShortIf
+    StatementNoShortIf -> IfThenElseStatementNoShortIf
+    StatementNoShortIf -> WhileStatementNoShortIf
+    StatementNoShortIf -> ForStatementNoShortIf
+    
+    StatementWithoutTrailingSubstatement -> AssertStatement
+    StatementWithoutTrailingSubstatement -> Block
+    StatementWithoutTrailingSubstatement -> EmptyStatement
+    StatementWithoutTrailingSubstatement -> ExpressionStatement
+    StatementWithoutTrailingSubstatement -> SwitchStatement
+    StatementWithoutTrailingSubstatement -> DoStatement
+    StatementWithoutTrailingSubstatement -> BreakStatement
+    StatementWithoutTrailingSubstatement -> ContinueStatement
+    StatementWithoutTrailingSubstatement -> ReturnStatement
+    StatementWithoutTrailingSubstatement -> SynchronizedStatement
+    StatementWithoutTrailingSubstatement -> ThrowStatement
+    StatementWithoutTrailingSubstatement -> TryStatement
+    
+    EmptyStatement ::= ';'
+    /.$putCase consumeEmptyStatement(); $break ./
+    
+    LabeledStatement ::= 'Identifier' ':' Statement
+    /.$putCase consumeStatementLabel() ; $break ./
+    
+    LabeledStatementNoShortIf ::= 'Identifier' ':' StatementNoShortIf
+    /.$putCase consumeStatementLabel() ; $break ./
+    
+    ExpressionStatement ::= StatementExpression ';'
+    /. $putCase consumeExpressionStatement(); $break ./
+    
+    StatementExpression ::= Assignment
+    StatementExpression ::= PreIncrementExpression
+    StatementExpression ::= PreDecrementExpression
+    StatementExpression ::= PostIncrementExpression
+    StatementExpression ::= PostDecrementExpression
+    StatementExpression ::= MethodInvocation
+    StatementExpression ::= ClassInstanceCreationExpression
+    
+    IfThenStatement ::=  'if' '(' Expression ')' Statement
+    /.$putCase consumeStatementIfNoElse(); $break ./
+    
+    IfThenElseStatement ::=  'if' '(' Expression ')' StatementNoShortIf 'else' Statement
+    /.$putCase consumeStatementIfWithElse(); $break ./
+    
+    IfThenElseStatementNoShortIf ::=  'if' '(' Expression ')' StatementNoShortIf 'else' StatementNoShortIf
+    /.$putCase consumeStatementIfWithElse(); $break ./
+    
+    SwitchStatement ::= 'switch' OpenBlock '(' Expression ')' SwitchBlock
+    /.$putCase consumeStatementSwitch() ; $break ./
+    
+    SwitchBlock ::= '{' '}'
+    /.$putCase consumeEmptySwitchBlock() ; $break ./
+    
+    SwitchBlock ::= '{' SwitchBlockStatements '}'
+    SwitchBlock ::= '{' SwitchLabels '}'
+    SwitchBlock ::= '{' SwitchBlockStatements SwitchLabels '}'
+    /.$putCase consumeSwitchBlock() ; $break ./
+    
+    SwitchBlockStatements -> SwitchBlockStatement
+    SwitchBlockStatements ::= SwitchBlockStatements SwitchBlockStatement
+    /.$putCase consumeSwitchBlockStatements() ; $break ./
+    
+    SwitchBlockStatement ::= SwitchLabels BlockStatements
+    /.$putCase consumeSwitchBlockStatement() ; $break ./
+    
+    SwitchLabels -> SwitchLabel
+    SwitchLabels ::= SwitchLabels SwitchLabel
+    /.$putCase consumeSwitchLabels() ; $break ./
+    
+    SwitchLabel ::= 'case' ConstantExpression ':'
+    /. $putCase consumeCaseLabel(); $break ./
+    
+    SwitchLabel ::= 'default' ':'
+    /. $putCase consumeDefaultLabel(); $break ./
+    
+    WhileStatement ::= 'while' '(' Expression ')' Statement
+    /.$putCase consumeStatementWhile() ; $break ./
+    
+    WhileStatementNoShortIf ::= 'while' '(' Expression ')' StatementNoShortIf
+    /.$putCase consumeStatementWhile() ; $break ./
+    
+    DoStatement ::= 'do' Statement 'while' '(' Expression ')' ';'
+    /.$putCase consumeStatementDo() ; $break ./
+    
+    ForStatement ::= 'for' '(' ForInitopt ';' Expressionopt ';' ForUpdateopt ')' Statement
+    /.$putCase consumeStatementFor() ; $break ./
+    ForStatementNoShortIf ::= 'for' '(' ForInitopt ';' Expressionopt ';' ForUpdateopt ')' StatementNoShortIf
+    /.$putCase consumeStatementFor() ; $break ./
+    
+    --the minus one allows to avoid a stack-to-stack transfer
+    ForInit ::= StatementExpressionList
+    /.$putCase consumeForInit() ; $break ./
+    ForInit -> LocalVariableDeclaration
+    
+    ForUpdate -> StatementExpressionList
+    
+    StatementExpressionList -> StatementExpression
+    StatementExpressionList ::= StatementExpressionList ',' StatementExpression
+    /.$putCase consumeStatementExpressionList() ; $break ./
+    
+    -- 1.4 feature
+    AssertStatement ::= 'assert' Expression ';'
+    /.$putCase consumeSimpleAssertStatement() ; $break ./
+    
+    AssertStatement ::= 'assert' Expression ':' Expression ';'
+    /.$putCase consumeAssertStatement() ; $break ./
+              
+    BreakStatement ::= 'break' ';'
+    /.$putCase consumeStatementBreak() ; $break ./
+    
+    BreakStatement ::= 'break' Identifier ';'
+    /.$putCase consumeStatementBreakWithLabel() ; $break ./
+    
+    ContinueStatement ::= 'continue' ';'
+    /.$putCase consumeStatementContinue() ; $break ./
+    
+    ContinueStatement ::= 'continue' Identifier ';'
+    /.$putCase consumeStatementContinueWithLabel() ; $break ./
+    
+    ReturnStatement ::= 'return' Expressionopt ';'
+    /.$putCase consumeStatementReturn() ; $break ./
+    
+    ThrowStatement ::= 'throw' Expression ';'
+    /.$putCase consumeStatementThrow();
+    $break ./
+    
+    SynchronizedStatement ::= OnlySynchronized '(' Expression ')'    Block
+    /.$putCase consumeStatementSynchronized(); $break ./
+    OnlySynchronized ::= 'synchronized'
+    /.$putCase consumeOnlySynchronized(); $break ./
+    
+    
+    TryStatement ::= 'try'    Block Catches
+    /.$putCase consumeStatementTry(false); $break ./
+    TryStatement ::= 'try'    Block Catchesopt Finally
+    /.$putCase consumeStatementTry(true); $break ./
+    
+    Catches -> CatchClause
+    Catches ::= Catches CatchClause
+    /.$putCase consumeCatches(); $break ./
+    
+    CatchClause ::= 'catch' '(' FormalParameter ')'    Block
+    /.$putCase consumeStatementCatch() ; $break ./
+    
+    Finally ::= 'finally'    Block
+    
+    --18.12 Productions from 14: Expressions
+    
+    --for source positionning purpose
+    PushLPAREN ::= '('
+    /.$putCase consumeLeftParen(); $break ./
+    PushRPAREN ::= ')'
+    /.$putCase consumeRightParen(); $break ./
+    
+    Primary -> PrimaryNoNewArray
+    Primary -> ArrayCreationExpression
+    
+    PrimaryNoNewArray -> Literal
+    PrimaryNoNewArray ::= 'this'
+    /.$putCase consumePrimaryNoNewArrayThis(); $break ./
+    
+    PrimaryNoNewArray ::=  PushLPAREN Expression PushRPAREN 
+    /.$putCase consumePrimaryNoNewArray(); $break ./
+    
+    PrimaryNoNewArray -> ClassInstanceCreationExpression
+    PrimaryNoNewArray -> FieldAccess
+    --1.1 feature
+    PrimaryNoNewArray ::= Name '.' 'this'
+    /.$putCase consumePrimaryNoNewArrayNameThis(); $break ./
+    PrimaryNoNewArray ::= Name '.' 'super'
+    /.$putCase consumePrimaryNoNewArrayNameSuper(); $break ./
+    
+    --1.1 feature
+    --PrimaryNoNewArray ::= Type '.' 'class'   
+    --inline Type in the previous rule in order to make the grammar LL1 instead 
+    -- of LL2. The result is the 3 next rules.
+    PrimaryNoNewArray ::= Name '.' 'class'
+    /.$putCase consumePrimaryNoNewArrayName(); $break ./
+    
+    PrimaryNoNewArray ::= ArrayType '.' 'class'
+    /.$putCase consumePrimaryNoNewArrayArrayType(); $break ./
+    
+    PrimaryNoNewArray ::= PrimitiveType '.' 'class'
+    /.$putCase consumePrimaryNoNewArrayPrimitiveType(); $break ./
+    
+    PrimaryNoNewArray -> MethodInvocation
+    PrimaryNoNewArray -> ArrayAccess
+    
+    --1.1 feature
+    --
+    -- In Java 1.0 a ClassBody could not appear at all in a
+    -- ClassInstanceCreationExpression.
+    --
+    
+    AllocationHeader ::= 'new' ClassType '(' ArgumentListopt ')'
+    /.$putCase consumeAllocationHeader(); $break ./
+    
+    ClassInstanceCreationExpression ::= 'new' ClassType '(' ArgumentListopt ')' ClassBodyopt
+    /.$putCase consumeClassInstanceCreationExpression(); $break ./
+    --1.1 feature
+    
+    ClassInstanceCreationExpression ::= Primary '.' 'new' SimpleName '(' ArgumentListopt ')' ClassBodyopt
+    /.$putCase consumeClassInstanceCreationExpressionQualified() ; $break ./
+    
+    --1.1 feature
+    ClassInstanceCreationExpression ::= ClassInstanceCreationExpressionName 'new' SimpleName '(' ArgumentListopt ')' ClassBodyopt
+    /.$putCase consumeClassInstanceCreationExpressionQualified() ; $break ./
+    
+    ClassInstanceCreationExpressionName ::= Name '.'
+    /.$putCase consumeClassInstanceCreationExpressionName() ; $break ./
+    
+    ClassBodyopt ::= $empty --test made using null as contents
+    /.$putCase consumeClassBodyopt(); $break ./
+    ClassBodyopt ::= EnterAnonymousClassBody ClassBody
+    
+    EnterAnonymousClassBody ::= $empty
+    /.$putCase consumeEnterAnonymousClassBody(); $break ./
+    
+    ArgumentList ::= Expression
+    ArgumentList ::= ArgumentList ',' Expression
+    /.$putCase consumeArgumentList(); $break ./
+    
+    --Thess rules are re-written in order to be ll1 
+    --ArrayCreationExpression ::= 'new' ArrayType ArrayInitializer
+    --ArrayCreationExpression ::= 'new' PrimitiveType DimExprs Dimsopt 
+    --ArrayCreationExpression ::= 'new' ClassOrInterfaceType DimExprs Dimsopt
+    --DimExprs ::= DimExpr
+    --DimExprs ::= DimExprs DimExpr
+    
+    ArrayCreationExpression ::= 'new' PrimitiveType DimWithOrWithOutExprs ArrayInitializeropt
+    /.$putCase consumeArrayCreationExpression(); $break ./
+    ArrayCreationExpression ::= 'new' ClassOrInterfaceType DimWithOrWithOutExprs ArrayInitializeropt
+    /.$putCase consumeArrayCreationExpression(); $break ./
+    
+    DimWithOrWithOutExprs ::= DimWithOrWithOutExpr
+    DimWithOrWithOutExprs ::= DimWithOrWithOutExprs DimWithOrWithOutExpr
+    /.$putCase consumeDimWithOrWithOutExprs(); $break ./
+    
+    DimWithOrWithOutExpr ::= '[' Expression ']'
+    DimWithOrWithOutExpr ::= '[' ']'
+    /. $putCase consumeDimWithOrWithOutExpr(); $break ./
+    -- -----------------------------------------------
+    
+    Dims ::= DimsLoop
+    /. $putCase consumeDims(); $break ./
+    DimsLoop -> OneDimLoop
+    DimsLoop ::= DimsLoop OneDimLoop
+    OneDimLoop ::= '[' ']'
+    /. $putCase consumeOneDimLoop(); $break ./
+    
+    FieldAccess ::= Primary '.' 'Identifier'
+    /.$putCase consumeFieldAccess(false); $break ./
+    
+    FieldAccess ::= 'super' '.' 'Identifier'
+    /.$putCase consumeFieldAccess(true); $break ./
+    
+    MethodInvocation ::= Name '(' ArgumentListopt ')'
+    /.$putCase consumeMethodInvocationName(); $break ./
+    
+    MethodInvocation ::= Primary '.' 'Identifier' '(' ArgumentListopt ')'
+    /.$putCase consumeMethodInvocationPrimary(); $break ./
+    
+    MethodInvocation ::= 'super' '.' 'Identifier' '(' ArgumentListopt ')'
+    /.$putCase consumeMethodInvocationSuper(); $break ./
+    
+    ArrayAccess ::= Name '[' Expression ']'
+    /.$putCase consumeArrayAccess(true); $break ./
+    ArrayAccess ::= PrimaryNoNewArray '[' Expression ']'
+    /.$putCase consumeArrayAccess(false); $break ./
+    
+    PostfixExpression -> Primary
+    PostfixExpression ::= Name
+    /.$putCase consumePostfixExpression(); $break ./
+    PostfixExpression -> PostIncrementExpression
+    PostfixExpression -> PostDecrementExpression
+    
+    PostIncrementExpression ::= PostfixExpression '++'
+    /.$putCase consumeUnaryExpression(OperatorExpression.PLUS,true); $break ./
+    
+    PostDecrementExpression ::= PostfixExpression '--'
+    /.$putCase consumeUnaryExpression(OperatorExpression.MINUS,true); $break ./
+    
+    --for source managment purpose
+    PushPosition ::= $empty
+     /.$putCase consumePushPosition(); $break ./
+    
+    UnaryExpression -> PreIncrementExpression
+    UnaryExpression -> PreDecrementExpression
+    UnaryExpression ::= '+' PushPosition UnaryExpression
+    /.$putCase consumeUnaryExpression(OperatorExpression.PLUS); $break ./
+    UnaryExpression ::= '-' PushPosition UnaryExpression
+    /.$putCase consumeUnaryExpression(OperatorExpression.MINUS); $break ./
+    UnaryExpression -> UnaryExpressionNotPlusMinus
+    
+    PreIncrementExpression ::= '++' PushPosition UnaryExpression
+    /.$putCase consumeUnaryExpression(OperatorExpression.PLUS,false); $break ./
+    
+    PreDecrementExpression ::= '--' PushPosition UnaryExpression
+    /.$putCase consumeUnaryExpression(OperatorExpression.MINUS,false); $break ./
+    
+    UnaryExpressionNotPlusMinus -> PostfixExpression
+    UnaryExpressionNotPlusMinus ::= '~' PushPosition UnaryExpression
+    /.$putCase consumeUnaryExpression(OperatorExpression.TWIDDLE); $break ./
+    UnaryExpressionNotPlusMinus ::= '!' PushPosition UnaryExpression
+    /.$putCase consumeUnaryExpression(OperatorExpression.NOT); $break ./
+    UnaryExpressionNotPlusMinus -> CastExpression
+    
+    CastExpression ::= PushLPAREN PrimitiveType Dimsopt PushRPAREN UnaryExpression
+    /.$putCase consumeCastExpression(); $break ./
+     CastExpression ::= PushLPAREN Name Dims PushRPAREN UnaryExpressionNotPlusMinus
+    /.$putCase consumeCastExpression(); $break ./
+    -- Expression is here only in order to make the grammar LL1
+    CastExpression ::= PushLPAREN Expression PushRPAREN UnaryExpressionNotPlusMinus
+    /.$putCase consumeCastExpressionLL1(); $break ./
+    
+    MultiplicativeExpression -> UnaryExpression
+    MultiplicativeExpression ::= MultiplicativeExpression '*' UnaryExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.MULTIPLY); $break ./
+    MultiplicativeExpression ::= MultiplicativeExpression '/' UnaryExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.DIVIDE); $break ./
+    MultiplicativeExpression ::= MultiplicativeExpression '%' UnaryExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.REMAINDER); $break ./
+    
+    AdditiveExpression -> MultiplicativeExpression
+    AdditiveExpression ::= AdditiveExpression '+' MultiplicativeExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.PLUS); $break ./
+    AdditiveExpression ::= AdditiveExpression '-' MultiplicativeExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.MINUS); $break ./
+    
+    ShiftExpression -> AdditiveExpression
+    ShiftExpression ::= ShiftExpression '<<'  AdditiveExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.LEFT_SHIFT); $break ./
+    ShiftExpression ::= ShiftExpression '>>'  AdditiveExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.RIGHT_SHIFT); $break ./
+    ShiftExpression ::= ShiftExpression '>>>' AdditiveExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.UNSIGNED_RIGHT_SHIFT); $break ./
+    
+    RelationalExpression -> ShiftExpression
+    RelationalExpression ::= RelationalExpression '<'  ShiftExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.LESS); $break ./
+    RelationalExpression ::= RelationalExpression '>'  ShiftExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.GREATER); $break ./
+    RelationalExpression ::= RelationalExpression '<=' ShiftExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.LESS_EQUAL); $break ./
+    RelationalExpression ::= RelationalExpression '>=' ShiftExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.GREATER_EQUAL); $break ./
+    RelationalExpression ::= RelationalExpression 'instanceof' ReferenceType
+    /.$putCase consumeInstanceOfExpression(OperatorExpression.INSTANCEOF); $break ./
+    
+    EqualityExpression -> RelationalExpression
+    EqualityExpression ::= EqualityExpression '==' RelationalExpression
+    /.$putCase consumeEqualityExpression(OperatorExpression.EQUAL_EQUAL); $break ./
+    EqualityExpression ::= EqualityExpression '!=' RelationalExpression
+    /.$putCase consumeEqualityExpression(OperatorExpression.NOT_EQUAL); $break ./
+    
+    AndExpression -> EqualityExpression
+    AndExpression ::= AndExpression '&' EqualityExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.AND); $break ./
+    
+    ExclusiveOrExpression -> AndExpression
+    ExclusiveOrExpression ::= ExclusiveOrExpression '^' AndExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.XOR); $break ./
+    
+    InclusiveOrExpression -> ExclusiveOrExpression
+    InclusiveOrExpression ::= InclusiveOrExpression '|' ExclusiveOrExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.OR); $break ./
+    
+    ConditionalAndExpression -> InclusiveOrExpression
+    ConditionalAndExpression ::= ConditionalAndExpression '&&' InclusiveOrExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.AND_AND); $break ./
+    
+    ConditionalOrExpression -> ConditionalAndExpression
+    ConditionalOrExpression ::= ConditionalOrExpression '||' ConditionalAndExpression
+    /.$putCase consumeBinaryExpression(OperatorExpression.OR_OR); $break ./
+    
+    ConditionalExpression -> ConditionalOrExpression
+    ConditionalExpression ::= ConditionalOrExpression '?' Expression ':' ConditionalExpression
+    /.$putCase consumeConditionalExpression(OperatorExpression.QUESTIONCOLON) ; $break ./
+    
+    AssignmentExpression -> ConditionalExpression
+    AssignmentExpression -> Assignment
+    
+    Assignment ::= LeftHandSide AssignmentOperator AssignmentExpression
+    /.$putCase consumeAssignment(); $break ./
+    
+    -- this rule is added to parse an array initializer in a assigment and then report a syntax error knowing the exact senario
+    InvalidArrayInitializerAssignement ::= LeftHandSide AssignmentOperator ArrayInitializer
+    Assignment ::= InvalidArrayInitializerAssignement
+    /.$putcase ignoreExpressionAssignment();$break ./
+    
+    LeftHandSide ::= Name
+    /.$putCase consumeLeftHandSide(); $break ./
+    LeftHandSide -> FieldAccess
+    LeftHandSide -> ArrayAccess
+    
+    AssignmentOperator ::= '='
+    /.$putCase consumeAssignmentOperator(EQUAL); $break ./
+    AssignmentOperator ::= '*='
+    /.$putCase consumeAssignmentOperator(MULTIPLY); $break ./
+    AssignmentOperator ::= '/='
+    /.$putCase consumeAssignmentOperator(DIVIDE); $break ./
+    AssignmentOperator ::= '%='
+    /.$putCase consumeAssignmentOperator(REMAINDER); $break ./
+    AssignmentOperator ::= '+='
+    /.$putCase consumeAssignmentOperator(PLUS); $break ./
+    AssignmentOperator ::= '-='
+    /.$putCase consumeAssignmentOperator(MINUS); $break ./
+    AssignmentOperator ::= '<<='
+    /.$putCase consumeAssignmentOperator(LEFT_SHIFT); $break ./
+    AssignmentOperator ::= '>>='
+    /.$putCase consumeAssignmentOperator(RIGHT_SHIFT); $break ./
+    AssignmentOperator ::= '>>>='
+    /.$putCase consumeAssignmentOperator(UNSIGNED_RIGHT_SHIFT); $break ./
+    AssignmentOperator ::= '&='
+    /.$putCase consumeAssignmentOperator(AND); $break ./
+    AssignmentOperator ::= '^='
+    /.$putCase consumeAssignmentOperator(XOR); $break ./
+    AssignmentOperator ::= '|='
+    /.$putCase consumeAssignmentOperator(OR); $break ./
+    
+    Expression -> AssignmentExpression
+    
+    ConstantExpression -> Expression
+    
+    -- The following rules are for optional nonterminals.
+    --
+    
+    PackageDeclarationopt -> $empty 
+    PackageDeclarationopt -> PackageDeclaration
+    
+    ClassHeaderExtendsopt ::= $empty
+    ClassHeaderExtendsopt -> ClassHeaderExtends
+    
+    Expressionopt ::= $empty
+    /.$putCase consumeEmptyExpression(); $break ./
+    Expressionopt -> Expression
+    
+    
+    ---------------------------------------------------------------------------------------
+    --
+    -- The rules below are for optional terminal symbols.  An optional comma,
+    -- is only used in the context of an array initializer - It is a
+    -- "syntactic sugar" that otherwise serves no other purpose. By contrast,
+    -- an optional identifier is used in the definition of a break and 
+    -- continue statement. When the identifier does not appear, a NULL
+    -- is produced. When the identifier is present, the user should use the
+    -- corresponding TOKEN(i) method. See break statement as an example.
+    --
+    ---------------------------------------------------------------------------------------
+    
+    ,opt -> $empty
+    ,opt -> ,
+    
+    ImportDeclarationsopt ::= $empty
+    /.$putCase consumeEmptyImportDeclarationsopt(); $break ./
+    ImportDeclarationsopt ::= ImportDeclarations
+    /.$putCase consumeImportDeclarationsopt(); $break ./
+    
+    
+    TypeDeclarationsopt ::= $empty
+    /.$putCase consumeEmptyTypeDeclarationsopt(); $break ./
+    TypeDeclarationsopt ::= TypeDeclarations
+    /.$putCase consumeTypeDeclarationsopt(); $break ./
+    
+    ClassBodyDeclarationsopt ::= $empty
+    /.$putCase consumeEmptyClassBodyDeclarationsopt(); $break ./
+    ClassBodyDeclarationsopt ::= NestedType ClassBodyDeclarations
+    /.$putCase consumeClassBodyDeclarationsopt(); $break ./
+    
+    Modifiersopt ::= $empty 
+    /. $putCase consumeDefaultModifiers(); $break ./
+    Modifiersopt ::= Modifiers 
+    /.$putCase consumeModifiers(); $break ./ 
+    
+    BlockStatementsopt ::= $empty
+    /.$putCase consumeEmptyBlockStatementsopt(); $break ./
+    BlockStatementsopt -> BlockStatements
+    
+    Dimsopt ::= $empty
+    /. $putCase consumeEmptyDimsopt(); $break ./
+    Dimsopt -> Dims
+    
+    ArgumentListopt ::= $empty
+    /. $putCase consumeEmptyArgumentListopt(); $break ./
+    ArgumentListopt -> ArgumentList
+    
+    MethodHeaderThrowsClauseopt ::= $empty
+    MethodHeaderThrowsClauseopt -> MethodHeaderThrowsClause
+       
+    FormalParameterListopt ::= $empty
+    /.$putcase consumeFormalParameterListopt(); $break ./
+    FormalParameterListopt -> FormalParameterList
+    
+    ClassHeaderImplementsopt ::= $empty
+    ClassHeaderImplementsopt -> ClassHeaderImplements
+    
+    InterfaceMemberDeclarationsopt ::= $empty
+    /. $putCase consumeEmptyInterfaceMemberDeclarationsopt(); $break ./
+    InterfaceMemberDeclarationsopt ::= NestedType InterfaceMemberDeclarations
+    /. $putCase consumeInterfaceMemberDeclarationsopt(); $break ./
+    
+    NestedType ::= $empty 
+    /.$putCase consumeNestedType(); $break./
+    
+    ForInitopt ::= $empty
+    /. $putCase consumeEmptyForInitopt(); $break ./
+    ForInitopt -> ForInit
+    
+    ForUpdateopt ::= $empty
+    /. $putCase consumeEmptyForUpdateopt(); $break ./
+     ForUpdateopt -> ForUpdate
+    
+    InterfaceHeaderExtendsopt ::= $empty
+    InterfaceHeaderExtendsopt -> InterfaceHeaderExtends
+    
+    Catchesopt ::= $empty
+    /. $putCase consumeEmptyCatchesopt(); $break ./
+    Catchesopt -> Catches
+    
+    ArrayInitializeropt ::= $empty
+    /. $putCase consumeEmptyArrayInitializeropt(); $break ./
+    ArrayInitializeropt -> ArrayInitializer
+    
+    /. }
+    } ./
+    
+    ---------------------------------------------------------------------------------------
+    
+    $names
+    
+    -- BodyMarker ::= '"class Identifier { ... MethodHeader "'
+    
+    -- void ::= 'void'
+    
+    PLUS_PLUS ::=    '++'   
+    MINUS_MINUS ::=    '--'   
+    EQUAL_EQUAL ::=    '=='   
+    LESS_EQUAL ::=    '<='   
+    GREATER_EQUAL ::=    '>='   
+    NOT_EQUAL ::=    '!='   
+    LEFT_SHIFT ::=    '<<'   
+    RIGHT_SHIFT ::=    '>>'   
+    UNSIGNED_RIGHT_SHIFT ::=    '>>>'  
+    PLUS_EQUAL ::=    '+='   
+    MINUS_EQUAL ::=    '-='   
+    MULTIPLY_EQUAL ::=    '*='   
+    DIVIDE_EQUAL ::=    '/='   
+    AND_EQUAL ::=    '&='   
+    OR_EQUAL ::=    '|='   
+    XOR_EQUAL ::=    '^='   
+    REMAINDER_EQUAL ::=    '%='   
+    LEFT_SHIFT_EQUAL ::=    '<<='  
+    RIGHT_SHIFT_EQUAL ::=    '>>='  
+    UNSIGNED_RIGHT_SHIFT_EQUAL ::=    '>>>=' 
+    OR_OR ::=    '||'   
+    AND_AND ::=    '&&'   
+    
+    PLUS ::=    '+'    
+    MINUS ::=    '-'    
+    NOT ::=    '!'    
+    REMAINDER ::=    '%'    
+    XOR ::=    '^'    
+    AND ::=    '&'    
+    MULTIPLY ::=    '*'    
+    OR ::=    '|'    
+    TWIDDLE ::=    '~'    
+    DIVIDE ::=    '/'    
+    GREATER ::=    '>'    
+    LESS ::=    '<'    
+    LPAREN ::=    '('    
+    RPAREN ::=    ')'    
+    LBRACE ::=    '{'    
+    RBRACE ::=    '}'    
+    LBRACKET ::=    '['    
+    RBRACKET ::=    ']'    
+    SEMICOLON ::=    ';'    
+    QUESTION ::=    '?'    
+    COLON ::=    ':'    
+    COMMA ::=    ','    
+    DOT ::=    '.'    
+    EQUAL ::=    '='    
+    
+    $end
+    -- need a carriage return after the $end
+    */
+  }
+  protected void ignoreExpressionAssignment() {
+    // Assignment ::= InvalidArrayInitializerAssignement
+    // encoded operator would be: intStack[intPtr]
+    intPtr--;
+    ArrayInitializer arrayInitializer = (ArrayInitializer) expressionStack[expressionPtr--];
+    expressionLengthPtr--;
+    // report a syntax error and abort parsing
+    problemReporter().arrayConstantsOnlyInArrayInitializers(arrayInitializer.sourceStart, arrayInitializer.sourceEnd);
+  }
+  protected void ignoreInterfaceDeclaration() {
+    // BlockStatement ::= InvalidInterfaceDeclaration
+    //InterfaceDeclaration ::= Modifiersopt 'interface' 'Identifier' ExtendsInterfacesopt InterfaceHeader InterfaceBody
+
+    // length declarations
+    int length;
+    if ((length = astLengthStack[astLengthPtr--]) != 0) {
+      //there are length declarations
+      //dispatch according to the type of the declarations
+      dispatchDeclarationInto(length);
+    }
+
+    flushAnnotationsDefinedPriorTo(endStatementPosition);
+
+    // report the problem and continue parsing
+    TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
+    typeDecl.bodyEnd = endStatementPosition;
+    problemReporter().cannotDeclareLocalInterface(typeDecl.name, typeDecl.sourceStart, typeDecl.sourceEnd);
+
+    // mark fields and initializer with local type mark if needed
+    markFieldsWithLocalType(typeDecl);
+
+    // remove the ast node created in interface header
+    astPtr--;
+    // Don't create an astnode for this inner interface, but have to push
+    // a 0 on the astLengthStack to be consistent with the reduction made
+    // at the end of the method:
+    // public void parse(MethodDeclaration md, CompilationUnitDeclaration unit)
+    pushOnAstLengthStack(0);
+  }
+  protected void ignoreInvalidConstructorDeclaration(boolean hasBody) {
+    // InvalidConstructorDeclaration ::= ConstructorHeader ConstructorBody ==> true
+    // InvalidConstructorDeclaration ::= ConstructorHeader ';' ==> false
+
+    /*
+    astStack : modifiers arguments throws statements
+    identifierStack : name
+     ==>
+    astStack : MethodDeclaration
+    identifierStack :
+    */
+
+    //must provide a default constructor call when needed
+
+    if (hasBody) {
+      // pop the position of the {  (body of the method) pushed in block decl
+      intPtr--;
+    }
+
+    //statements
+    if (hasBody) {
+      realBlockPtr--;
+    }
+
+    int length;
+    if (hasBody && ((length = astLengthStack[astLengthPtr--]) != 0)) {
+      astPtr -= length;
+    }
+  }
+  protected void ignoreMethodBody() {
+    // InterfaceMemberDeclaration ::= InvalidMethodDeclaration
+
+    /*
+    astStack : modifiers arguments throws statements
+    identifierStack : type name
+    intStack : dim dim dim
+     ==>
+    astStack : MethodDeclaration
+    identifierStack :
+    intStack : 
+    */
+
+    // pop the position of the {  (body of the method) pushed in block decl
+    intPtr--;
+    // retrieve end position of method declarator
+
+    //statements
+    realBlockPtr--;
+    int length;
+    if ((length = astLengthStack[astLengthPtr--]) != 0) {
+      astPtr -= length;
+    }
+
+    //watch for } that could be given as a unicode ! ( u007D is '}' )
+    MethodDeclaration md = (MethodDeclaration) astStack[astPtr];
+    md.bodyEnd = endPosition;
+    md.declarationSourceEnd = flushAnnotationsDefinedPriorTo(endStatementPosition);
+
+    // report the problem and continue the parsing - narrowing the problem onto the method
+    problemReporter().abstractMethodNeedingNoBody(md);
+  }
+  public void initialize() {
+    //positionning the parser for a new compilation unit
+    //avoiding stack reallocation and all that....
+    astPtr = -1;
+    astLengthPtr = -1;
+    expressionPtr = -1;
+    expressionLengthPtr = -1;
+    identifierPtr = -1;
+    identifierLengthPtr = -1;
+    intPtr = -1;
+    nestedMethod[nestedType = 0] = 0; // need to reset for further reuse
+    variablesCounter[nestedType] = 0;
+    dimensions = 0;
+    realBlockPtr = -1;
+    compilationUnit = null;
+    referenceContext = null;
+    endStatementPosition = 0;
+
+    //remove objects from stack too, while the same parser/compiler couple is
+    //re-used between two compilations ....
+
+    int astLength = astStack.length;
+    if (noAstNodes.length < astLength) {
+      noAstNodes = new AstNode[astLength];
+      //System.out.println("Resized AST stacks : "+ astLength);
+
+    }
+    System.arraycopy(noAstNodes, 0, astStack, 0, astLength);
+
+    int expressionLength = expressionStack.length;
+    if (noExpressions.length < expressionLength) {
+      noExpressions = new Expression[expressionLength];
+      //System.out.println("Resized EXPR stacks : "+ expressionLength);
+    }
+    System.arraycopy(noExpressions, 0, expressionStack, 0, expressionLength);
+
+    // reset scanner state
+    scanner.commentPtr = -1;
+    scanner.eofPosition = Integer.MAX_VALUE;
+
+    resetModifiers();
+
+    // recovery
+    lastCheckPoint = -1;
+    currentElement = null;
+    restartRecovery = false;
+    hasReportedError = false;
+    recoveredStaticInitializerStart = 0;
+    lastIgnoredToken = -1;
+    lastErrorEndPosition = -1;
+    listLength = 0;
+  }
+  public void initializeScanner() {
+    this.scanner =
+      new Scanner(
+        false,
+        false,
+        this.problemReporter.options.getNonExternalizedStringLiteralSeverity() != ProblemSeverities.Ignore,
+        this.assertMode);
+  }
+  public final static void initTables() throws java.io.IOException {
+
+    final String prefix = FILEPREFIX;
+    int i = 0;
+    lhs = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+    char[] chars = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+    check_table = new short[chars.length];
+    for (int c = chars.length; c-- > 0;) {
+      check_table[c] = (short) (chars[c] - 32768);
+    }
+    asb = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+    asr = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+    symbol_index = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+    action = lhs;
+  }
+  public final void jumpOverMethodBody() {
+    //on diet parsing.....do not buffer method statements
+
+    //the scanner.diet is reinitialized to false
+    //automatically by the scanner once it has jumped over
+    //the statements
+
+    if (diet && (dietInt == 0))
+      scanner.diet = true;
+  }
+  protected void markCurrentMethodWithLocalType() {
+    if (this.currentElement != null)
+      return; // this is already done in the recovery code
+    for (int i = this.astPtr; i >= 0; i--) {
+      AstNode node = this.astStack[i];
+      if (node instanceof AbstractMethodDeclaration
+        || node instanceof TypeDeclaration) { // mark type for now: all fields will be marked when added to this type
+        node.bits |= AstNode.HasLocalTypeMASK;
+        return;
+      }
+    }
+    // default to reference context (case of parse method body)
+    if (this.referenceContext instanceof AbstractMethodDeclaration || this.referenceContext instanceof TypeDeclaration) {
+      ((AstNode) this.referenceContext).bits |= AstNode.HasLocalTypeMASK;
+    }
+  }
+  protected void markFieldsWithLocalType(TypeDeclaration type) {
+    if (type.fields == null || (type.bits & AstNode.HasLocalTypeMASK) == 0)
+      return;
+    for (int i = 0, length = type.fields.length; i < length; i++) {
+      type.fields[i].bits |= AstNode.HasLocalTypeMASK;
+    }
+  }
+  /*
+   * Move checkpoint location (current implementation is moving it by one token)
+   *
+   * Answers true if successfully moved checkpoint (i.e. did not attempt to move it
+   * beyond end of file).
+   */
+  protected boolean moveRecoveryCheckpoint() {
+
+    int pos = lastCheckPoint;
+    /* reset scanner, and move checkpoint by one token */
+    scanner.startPosition = pos;
+    scanner.currentPosition = pos;
+    scanner.diet = false; // quit jumping over method bodies
+
+    /* if about to restart, then no need to shift token */
+    if (restartRecovery) {
+      lastIgnoredToken = -1;
+      return true;
+    }
+
+    /* protect against shifting on an invalid token */
+    lastIgnoredToken = nextIgnoredToken;
+    nextIgnoredToken = -1;
+    do {
+      try {
+        nextIgnoredToken = scanner.getNextToken();
+        if (scanner.currentPosition == scanner.startPosition) {
+          scanner.currentPosition++; // on fake completion identifier
+          nextIgnoredToken = -1;
+        }
+
+      } catch (InvalidInputException e) {
+        pos = scanner.currentPosition;
+      }
+    } while (nextIgnoredToken < 0);
+
+    if (nextIgnoredToken == TokenNameEOF) { // no more recovery after this point
+      if (currentToken == TokenNameEOF) { // already tried one iteration on EOF
+        return false;
+      }
+    }
+    lastCheckPoint = scanner.currentPosition;
+
+    /* reset scanner again to previous checkpoint location*/
+    scanner.startPosition = pos;
+    scanner.currentPosition = pos;
+    scanner.commentPtr = -1;
+
+    return true;
+
+    /*
+       The following implementation moves the checkpoint location by one line:
+        
+       int pos = lastCheckPoint;
+       // reset scanner, and move checkpoint by one token
+       scanner.startPosition = pos;
+       scanner.currentPosition = pos;
+       scanner.diet = false; // quit jumping over method bodies
+       
+       // if about to restart, then no need to shift token
+       if (restartRecovery){
+               lastIgnoredToken = -1;
+               return true;
+       }
+       
+       // protect against shifting on an invalid token
+       lastIgnoredToken = nextIgnoredToken;
+       nextIgnoredToken = -1;
+       
+       boolean wasTokenizingWhiteSpace = scanner.tokenizeWhiteSpace;
+       scanner.tokenizeWhiteSpace = true;
+       checkpointMove: 
+               do {
+                       try {
+                               nextIgnoredToken = scanner.getNextToken();
+                               switch(nextIgnoredToken){
+                                       case Scanner.TokenNameWHITESPACE :
+                                               if(scanner.getLineNumber(scanner.startPosition)
+                                                       == scanner.getLineNumber(scanner.currentPosition)){
+                                                       nextIgnoredToken = -1;
+                                                       }
+                                               break;
+                                       case TokenNameSEMICOLON :
+                                       case TokenNameLBRACE :
+                                       case TokenNameRBRACE :
+                                               break;
+                                       case TokenNameIdentifier :
+                                               if(scanner.currentPosition == scanner.startPosition){
+                                                       scanner.currentPosition++; // on fake completion identifier
+                                               }
+                                       default:                                                
+                                               nextIgnoredToken = -1;
+                                               break;
+                                       case TokenNameEOF :
+                                               break checkpointMove;
+                               }
+                       } catch(InvalidInputException e){
+                               pos = scanner.currentPosition;
+                       }
+               } while (nextIgnoredToken < 0);
+       scanner.tokenizeWhiteSpace = wasTokenizingWhiteSpace;
+       
+       if (nextIgnoredToken == TokenNameEOF) { // no more recovery after this point
+               if (currentToken == TokenNameEOF) { // already tried one iteration on EOF
+                       return false;
+               }
+       }
+       lastCheckPoint = scanner.currentPosition;
+       
+       // reset scanner again to previous checkpoint location
+       scanner.startPosition = pos;
+       scanner.currentPosition = pos;
+       scanner.commentPtr = -1;
+    
+       return true;
+    */
+  }
+  protected MessageSend newMessageSend() {
+    // '(' ArgumentListopt ')'
+    // the arguments are on the expression stack
+
+    MessageSend m = new MessageSend();
+    int length;
+    if ((length = expressionLengthStack[expressionLengthPtr--]) != 0) {
+      expressionPtr -= length;
+      System.arraycopy(expressionStack, expressionPtr + 1, m.arguments = new Expression[length], 0, length);
+    };
+    return m;
+  }
+  protected static int ntAction(int state, int sym) {
+    return action[state + sym];
+  }
+  private final void optimizedConcatNodeLists() {
+    /*back from a recursive loop. Virtualy group the
+    astNode into an array using astLengthStack*/
+
+    /*
+     * This is a case where you have two sublists into the astStack that you want
+     * to merge in one list. There is no action required on the astStack. The only
+     * thing you need to do is merge the two lengths specified on the astStackLength.
+     * The top two length are for example:
+     * ... p   n
+     * and you want to result in a list like:
+     * ... n+p 
+     * This means that the p could be equals to 0 in case there is no astNode pushed
+     * on the astStack.
+     * Look at the InterfaceMemberDeclarations for an example.
+     * This case optimizes the fact that p == 1.
+     */
+
+    astLengthStack[--astLengthPtr]++;
+  }
+  protected static int original_state(int state) {
+    return -check(state);
+  }
+  /*main loop of the automat
+  When a rule is reduced, the method consumeRule(int) is called with the number
+  of the consumed rule. When a terminal is consumed, the method consumeToken(int) is 
+  called in order to remember (when needed) the consumed token */
+  // (int)asr[asi(act)]
+  // name[symbol_index[currentKind]]
+  protected void parse() {
+
+    hasReportedError = false;
+    int act = START_STATE;
+    stateStackTop = -1;
+    currentToken = getFirstToken();
+    ProcessTerminals : for (;;) {
+      try {
+        stack[++stateStackTop] = act;
+      } catch (IndexOutOfBoundsException e) {
+        int oldStackLength = stack.length;
+        int oldStack[] = stack;
+        stack = new int[oldStackLength + StackIncrement];
+        System.arraycopy(oldStack, 0, stack, 0, oldStackLength);
+        stack[stateStackTop] = act;
+      };
+
+      act = tAction(act, currentToken);
+
+      if (act == ERROR_ACTION || restartRecovery) {
+        int errorPos = scanner.currentPosition;
+        if (!hasReportedError) {
+          this.reportSyntaxError(ERROR_ACTION, currentToken, stateStackTop);
+          hasReportedError = true;
+        }
+        if (resumeOnSyntaxError()) {
+          if (act == ERROR_ACTION)
+            lastErrorEndPosition = errorPos;
+          act = START_STATE;
+          stateStackTop = -1;
+          currentToken = getFirstToken();
+          continue ProcessTerminals;
+        } else {
+          act = ERROR_ACTION;
+        }
+        break ProcessTerminals;
+      }
+      if (act <= NUM_RULES)
+        stateStackTop--;
+      else if (act > ERROR_ACTION) { /* shift-reduce */
+        consumeToken(currentToken);
+        if (currentElement != null)
+          this.recoveryTokenCheck();
+        try {
+          currentToken = scanner.getNextToken();
+        } catch (InvalidInputException e) {
+          if (!hasReportedError) {
+            this.problemReporter().scannerError(this, e.getMessage());
+            hasReportedError = true;
+          }
+          lastCheckPoint = scanner.currentPosition;
+          restartRecovery = true;
+        }
+        act -= ERROR_ACTION;
+      } else if (act < ACCEPT_ACTION) { /* shift */
+        consumeToken(currentToken);
+        if (currentElement != null)
+          this.recoveryTokenCheck();
+        try {
+          currentToken = scanner.getNextToken();
+        } catch (InvalidInputException e) {
+          if (!hasReportedError) {
+            this.problemReporter().scannerError(this, e.getMessage());
+            hasReportedError = true;
+          }
+          lastCheckPoint = scanner.currentPosition;
+          restartRecovery = true;
+        }
+        continue ProcessTerminals;
+      } else
+        break ProcessTerminals;
+
+      ProcessNonTerminals : do { /* reduce */
+        consumeRule(act);
+        stateStackTop -= (rhs[act] - 1);
+        act = ntAction(stack[stateStackTop], lhs[act]);
+      } while (act <= NUM_RULES);
+    }
+    endParse(act);
+  }
+  // A P I
+
+  public void parse(ConstructorDeclaration cd, CompilationUnitDeclaration unit) {
+    //only parse the method body of cd
+    //fill out its statements
+
+    //convert bugs into parse error
+
+    initialize();
+    goForConstructorBody();
+    nestedMethod[nestedType]++;
+
+    referenceContext = cd;
+    compilationUnit = unit;
+
+    scanner.resetTo(cd.sourceEnd + 1, cd.declarationSourceEnd);
+    try {
+      parse();
+    } catch (AbortCompilation ex) {
+      lastAct = ERROR_ACTION;
+    } finally {
+      nestedMethod[nestedType]--;
+    }
+
+    if (lastAct == ERROR_ACTION) {
+      initialize();
+      return;
+    }
+
+    //statements
+    cd.explicitDeclarations = realBlockStack[realBlockPtr--];
+    int length;
+    if ((length = astLengthStack[astLengthPtr--]) != 0) {
+      astPtr -= length;
+      if (astStack[astPtr + 1] instanceof ExplicitConstructorCall)
+        //avoid a isSomeThing that would only be used here BUT what is faster between two alternatives ?
+        {
+        System.arraycopy(astStack, astPtr + 2, cd.statements = new Statement[length - 1], 0, length - 1);
+        cd.constructorCall = (ExplicitConstructorCall) astStack[astPtr + 1];
+      } else { //need to add explicitly the super();
+        System.arraycopy(astStack, astPtr + 1, cd.statements = new Statement[length], 0, length);
+        cd.constructorCall = SuperReference.implicitSuperConstructorCall();
+      }
+    } else {
+      cd.constructorCall = SuperReference.implicitSuperConstructorCall();
+    }
+
+    if (cd.constructorCall.sourceEnd == 0) {
+      cd.constructorCall.sourceEnd = cd.sourceEnd;
+      cd.constructorCall.sourceStart = cd.sourceStart;
+    }
+  }
+  // A P I
+
+  public void parse(Initializer ini, TypeDeclaration type, CompilationUnitDeclaration unit) {
+    //only parse the method body of md
+    //fill out method statements
+
+    //convert bugs into parse error
+
+    initialize();
+    goForInitializer();
+    nestedMethod[nestedType]++;
+
+    referenceContext = type;
+    compilationUnit = unit;
+
+    scanner.resetTo(ini.sourceStart, ini.sourceEnd); // just on the beginning {
+    try {
+      parse();
+    } catch (AbortCompilation ex) {
+      lastAct = ERROR_ACTION;
+    } finally {
+      nestedMethod[nestedType]--;
+    }
+
+    if (lastAct == ERROR_ACTION) {
+      return;
+    }
+
+    ini.block = ((Initializer) astStack[astPtr]).block;
+
+    // mark initializer with local type if one was found during parsing
+    if ((type.bits & AstNode.HasLocalTypeMASK) != 0) {
+      ini.bits |= AstNode.HasLocalTypeMASK;
+    }
+  }
+  // A P I
+
+  public void parse(MethodDeclaration md, CompilationUnitDeclaration unit) {
+    //only parse the method body of md
+    //fill out method statements
+
+    //convert bugs into parse error
+
+    if (md.isAbstract())
+      return;
+    if (md.isNative())
+      return;
+    if ((md.modifiers & AccSemicolonBody) != 0)
+      return;
+
+    initialize();
+    goForMethodBody();
+    nestedMethod[nestedType]++;
+
+    referenceContext = md;
+    compilationUnit = unit;
+
+    scanner.resetTo(md.sourceEnd + 1, md.declarationSourceEnd);
+    // reset the scanner to parser from { down to }
+    try {
+      parse();
+    } catch (AbortCompilation ex) {
+      lastAct = ERROR_ACTION;
+    } finally {
+      nestedMethod[nestedType]--;
+    }
+
+    if (lastAct == ERROR_ACTION) {
+      return;
+    }
+
+    //refill statements
+    md.explicitDeclarations = realBlockStack[realBlockPtr--];
+    int length;
+    if ((length = astLengthStack[astLengthPtr--]) != 0)
+      System.arraycopy(astStack, (astPtr -= length) + 1, md.statements = new Statement[length], 0, length);
+  }
+  // A P I
+
+  public CompilationUnitDeclaration parse(ICompilationUnit sourceUnit, CompilationResult compilationResult) {
+    // parses a compilation unit and manages error handling (even bugs....)
+
+    CompilationUnitDeclaration unit;
+    try {
+      /* automaton initialization */
+      initialize();
+      goForCompilationUnit();
+
+      /* scanner initialization */
+      scanner.setSource(sourceUnit.getContents());
+
+      /* unit creation */
+      referenceContext =
+        compilationUnit = new CompilationUnitDeclaration(problemReporter, compilationResult, scanner.source.length);
+      /* run automaton */
+      parse();
+    } finally {
+      unit = compilationUnit;
+      compilationUnit = null; // reset parser
+    }
+    return unit;
+  }
+  // A P I
+
+  public CompilationUnitDeclaration parse(ICompilationUnit sourceUnit, CompilationResult compilationResult, int start, int end) {
+    // parses a compilation unit and manages error handling (even bugs....)
+
+    CompilationUnitDeclaration unit;
+    try {
+      /* automaton initialization */
+      initialize();
+      goForCompilationUnit();
+
+      /* scanner initialization */
+      scanner.setSource(sourceUnit.getContents());
+      scanner.resetTo(start, end);
+      /* unit creation */
+      referenceContext =
+        compilationUnit = new CompilationUnitDeclaration(problemReporter, compilationResult, scanner.source.length);
+      /* run automaton */
+      parse();
+    } finally {
+      unit = compilationUnit;
+      compilationUnit = null; // reset parser
+    }
+    return unit;
+  }
+  /**
+   * Returns this parser's problem reporter initialized with its reference context.
+   * Also it is assumed that a problem is going to be reported, so initializes
+   * the compilation result's line positions.
+   */
+  public ProblemReporter problemReporter() {
+    if (scanner.recordLineSeparator) {
+      compilationUnit.compilationResult.lineSeparatorPositions = scanner.getLineEnds();
+    }
+    problemReporter.referenceContext = referenceContext;
+    return problemReporter;
+  }
+  protected void pushIdentifier() {
+    /*push the consumeToken on the identifier stack.
+    Increase the total number of identifier in the stack.
+    identifierPtr points on the next top */
+
+    try {
+      identifierStack[++identifierPtr] = scanner.getCurrentIdentifierSource();
+      identifierPositionStack[identifierPtr] = (((long) scanner.startPosition) << 32) + (scanner.currentPosition - 1);
+    } catch (IndexOutOfBoundsException e) {
+      /*---stack reallaocation (identifierPtr is correct)---*/
+      int oldStackLength = identifierStack.length;
+      char[][] oldStack = identifierStack;
+      identifierStack = new char[oldStackLength + 20][];
+      System.arraycopy(oldStack, 0, identifierStack, 0, oldStackLength);
+      identifierStack[identifierPtr] = scanner.getCurrentTokenSource();
+      /*identifier position stack*/
+      long[] oldPos = identifierPositionStack;
+      identifierPositionStack = new long[oldStackLength + 20];
+      System.arraycopy(oldPos, 0, identifierPositionStack, 0, oldStackLength);
+      identifierPositionStack[identifierPtr] = (((long) scanner.startPosition) << 32) + (scanner.currentPosition - 1);
+    };
+
+    try {
+      identifierLengthStack[++identifierLengthPtr] = 1;
+    } catch (IndexOutOfBoundsException e) {
+      /*---stack reallocation (identifierLengthPtr is correct)---*/
+      int oldStackLength = identifierLengthStack.length;
+      int oldStack[] = identifierLengthStack;
+      identifierLengthStack = new int[oldStackLength + 10];
+      System.arraycopy(oldStack, 0, identifierLengthStack, 0, oldStackLength);
+      identifierLengthStack[identifierLengthPtr] = 1;
+    };
+
+  }
+  protected void pushIdentifier(int flag) {
+    /*push a special flag on the stack :
+    -zero stands for optional Name
+    -negative number for direct ref to base types.
+    identifierLengthPtr points on the top */
+
+    try {
+      identifierLengthStack[++identifierLengthPtr] = flag;
+    } catch (IndexOutOfBoundsException e) {
+      /*---stack reallaocation (identifierLengthPtr is correct)---*/
+      int oldStackLength = identifierLengthStack.length;
+      int oldStack[] = identifierLengthStack;
+      identifierLengthStack = new int[oldStackLength + 10];
+      System.arraycopy(oldStack, 0, identifierLengthStack, 0, oldStackLength);
+      identifierLengthStack[identifierLengthPtr] = flag;
+    };
+
+  }
+  protected void pushOnAstLengthStack(int pos) {
+    try {
+      astLengthStack[++astLengthPtr] = pos;
+    } catch (IndexOutOfBoundsException e) {
+      int oldStackLength = astLengthStack.length;
+      int[] oldPos = astLengthStack;
+      astLengthStack = new int[oldStackLength + StackIncrement];
+      System.arraycopy(oldPos, 0, astLengthStack, 0, oldStackLength);
+      astLengthStack[astLengthPtr] = pos;
+    }
+  }
+  protected void pushOnAstStack(AstNode node) {
+    /*add a new obj on top of the ast stack
+    astPtr points on the top*/
+
+    try {
+      astStack[++astPtr] = node;
+    } catch (IndexOutOfBoundsException e) {
+      int oldStackLength = astStack.length;
+      AstNode[] oldStack = astStack;
+      astStack = new AstNode[oldStackLength + AstStackIncrement];
+      System.arraycopy(oldStack, 0, astStack, 0, oldStackLength);
+      astPtr = oldStackLength;
+      astStack[astPtr] = node;
+    }
+
+    try {
+      astLengthStack[++astLengthPtr] = 1;
+    } catch (IndexOutOfBoundsException e) {
+      int oldStackLength = astLengthStack.length;
+      int[] oldPos = astLengthStack;
+      astLengthStack = new int[oldStackLength + AstStackIncrement];
+      System.arraycopy(oldPos, 0, astLengthStack, 0, oldStackLength);
+      astLengthStack[astLengthPtr] = 1;
+    }
+  }
+  protected void pushOnExpressionStack(Expression expr) {
+
+    try {
+      expressionStack[++expressionPtr] = expr;
+    } catch (IndexOutOfBoundsException e) {
+      //expressionPtr is correct 
+      int oldStackLength = expressionStack.length;
+      Expression[] oldStack = expressionStack;
+      expressionStack = new Expression[oldStackLength + ExpressionStackIncrement];
+      System.arraycopy(oldStack, 0, expressionStack, 0, oldStackLength);
+      expressionStack[expressionPtr] = expr;
+    }
+
+    try {
+      expressionLengthStack[++expressionLengthPtr] = 1;
+    } catch (IndexOutOfBoundsException e) {
+      int oldStackLength = expressionLengthStack.length;
+      int[] oldPos = expressionLengthStack;
+      expressionLengthStack = new int[oldStackLength + ExpressionStackIncrement];
+      System.arraycopy(oldPos, 0, expressionLengthStack, 0, oldStackLength);
+      expressionLengthStack[expressionLengthPtr] = 1;
+    }
+  }
+  protected void pushOnExpressionStackLengthStack(int pos) {
+    try {
+      expressionLengthStack[++expressionLengthPtr] = pos;
+    } catch (IndexOutOfBoundsException e) {
+      int oldStackLength = expressionLengthStack.length;
+      int[] oldPos = expressionLengthStack;
+      expressionLengthStack = new int[oldStackLength + StackIncrement];
+      System.arraycopy(oldPos, 0, expressionLengthStack, 0, oldStackLength);
+      expressionLengthStack[expressionLengthPtr] = pos;
+    }
+  }
+  protected void pushOnIntStack(int pos) {
+
+    try {
+      intStack[++intPtr] = pos;
+    } catch (IndexOutOfBoundsException e) {
+      //intPtr is correct 
+      int oldStackLength = intStack.length;
+      int oldStack[] = intStack;
+      intStack = new int[oldStackLength + StackIncrement];
+      System.arraycopy(oldStack, 0, intStack, 0, oldStackLength);
+      intStack[intPtr] = pos;
+    }
+  }
+  protected static char[] readTable(String filename) throws java.io.IOException {
+
+    //files are located at Parser.class directory
+
+    InputStream stream = new BufferedInputStream(Parser.class.getResourceAsStream(filename));
+    if (stream == null) {
+      throw new java.io.IOException(Util.bind("parser.missingFile", filename)); //$NON-NLS-1$
+    }
+    byte[] bytes = null;
+    try {
+      bytes = Util.getInputStreamAsByteArray(stream, -1);
+    } finally {
+      try {
+        stream.close();
+      } catch (IOException e) {
+      }
+    }
+
+    //minimal integrity check (even size expected)
+    int length = bytes.length;
+    if (length % 2 != 0)
+      throw new java.io.IOException(Util.bind("parser.corruptedFile", filename)); //$NON-NLS-1$
+
+    // convert bytes into chars
+    char[] chars = new char[length / 2];
+    int i = 0;
+    int charIndex = 0;
+
+    while (true) {
+      chars[charIndex++] = (char) (((bytes[i++] & 0xFF) << 8) + (bytes[i++] & 0xFF));
+      if (i == length)
+        break;
+    }
+    return chars;
+  }
+  /* Token check performed on every token shift once having entered
+   * recovery mode.
+   */
+  public void recoveryTokenCheck() {
+    switch (currentToken) {
+      case TokenNameLBRACE :
+        {
+          RecoveredElement newElement = currentElement.updateOnOpeningBrace(scanner.currentPosition - 1);
+          lastCheckPoint = scanner.currentPosition;
+          if (newElement != null) { // null means nothing happened
+            restartRecovery = true; // opening brace detected
+            currentElement = newElement;
+          }
+          break;
+        }
+      case TokenNameRBRACE :
+        {
+          endPosition = this.flushAnnotationsDefinedPriorTo(scanner.currentPosition - 1);
+          RecoveredElement newElement = currentElement.updateOnClosingBrace(scanner.startPosition, scanner.currentPosition - 1);
+          lastCheckPoint = scanner.currentPosition;
+          if (newElement != currentElement) {
+            currentElement = newElement;
+          }
+        }
+    }
+  }
+  protected void reportSyntaxError(int act, int currentKind, int stateStackTop) {
+
+    /* remember current scanner position */
+    int startPos = scanner.startPosition;
+    int currentPos = scanner.currentPosition;
+
+    String[] expectings;
+    String tokenName = name[symbol_index[currentKind]];
+
+    //fetch all "accurate" possible terminals that could recover the error
+    int start, end = start = asi(stack[stateStackTop]);
+    while (asr[end] != 0)
+      end++;
+    int length = end - start;
+    expectings = new String[length];
+    if (length != 0) {
+      char[] indexes = new char[length];
+      System.arraycopy(asr, start, indexes, 0, length);
+      for (int i = 0; i < length; i++) {
+        expectings[i] = name[symbol_index[indexes[i]]];
+      }
+    }
+
+    //if the pb is an EOF, try to tell the user that they are some 
+    if (tokenName.equals(UNEXPECTED_EOF)) {
+      if (!this.checkAndReportBracketAnomalies(problemReporter())) {
+        char[] tokenSource;
+        try {
+          tokenSource = this.scanner.getCurrentTokenSource();
+        } catch (Exception e) {
+          tokenSource = new char[] {
+          };
+        }
+        problemReporter().parseError(
+          this.scanner.startPosition,
+          this.scanner.currentPosition - 1,
+          tokenSource,
+          tokenName,
+          expectings);
+      }
+    } else { //the next test is HEAVILY grammar DEPENDENT.
+      if ((length == 2) && (tokenName.equals(";")) //$NON-NLS-1$
+      && (expectings[0] == "++") //$NON-NLS-1$
+      && (expectings[1] == "--") //$NON-NLS-1$
+      && (expressionPtr > -1)) {
+        // the ; is not the expected token ==> it ends a statement when an expression is not ended
+        problemReporter().invalidExpressionAsStatement(expressionStack[expressionPtr]);
+      } else {
+        char[] tokenSource;
+        try {
+          tokenSource = this.scanner.getCurrentTokenSource();
+        } catch (Exception e) {
+          tokenSource = new char[] {
+          };
+        }
+        problemReporter().parseError(
+          this.scanner.startPosition,
+          this.scanner.currentPosition - 1,
+          tokenSource,
+          tokenName,
+          expectings);
+        this.checkAndReportBracketAnomalies(problemReporter());
+      }
+    }
+    /* reset scanner where it was */
+    scanner.startPosition = startPos;
+    scanner.currentPosition = currentPos;
+  }
+  protected void resetModifiers() {
+    modifiers = AccDefault;
+    modifiersSourceStart = -1; // <-- see comment into modifiersFlag(int)
+    scanner.commentPtr = -1;
+  }
+  /*
+   * Reset context so as to resume to regular parse loop
+   */
+  protected void resetStacks() {
+
+    astPtr = -1;
+    astLengthPtr = -1;
+    expressionPtr = -1;
+    expressionLengthPtr = -1;
+    identifierPtr = -1;
+    identifierLengthPtr = -1;
+    intPtr = -1;
+    nestedMethod[nestedType = 0] = 0; // need to reset for further reuse
+    variablesCounter[nestedType] = 0;
+    dimensions = 0;
+    realBlockStack[realBlockPtr = 0] = 0;
+    recoveredStaticInitializerStart = 0;
+    listLength = 0;
+  }
+  /*
+   * Reset context so as to resume to regular parse loop
+   * If unable to reset for resuming, answers false.
+   *
+   * Move checkpoint location, reset internal stacks and
+   * decide which grammar goal is activated.
+   */
+  protected boolean resumeAfterRecovery() {
+
+    // reset internal stacks 
+    this.resetStacks();
+
+    /* attempt to move checkpoint location */
+    if (!this.moveRecoveryCheckpoint())
+      return false;
+
+    // only look for headers
+    if (referenceContext instanceof CompilationUnitDeclaration) {
+      goForHeaders();
+      diet = true; // passed this point, will not consider method bodies
+      return true;
+    }
+    // does not know how to restart
+    return false;
+  }
+  /*
+   * Syntax error was detected. Will attempt to perform some recovery action in order
+   * to resume to the regular parse loop.
+   */
+  protected boolean resumeOnSyntaxError() {
+
+    /* request recovery initialization */
+    if (currentElement == null) {
+      currentElement = this.buildInitialRecoveryState(); // build some recovered elements
+    }
+    /* do not investigate deeper in recovery when no recovered element */
+    if (currentElement == null)
+      return false;
+
+    /* manual forced recovery restart - after headers */
+    if (restartRecovery) {
+      restartRecovery = false;
+    }
+    /* update recovery state with current error state of the parser */
+    this.updateRecoveryState();
+
+    /* attempt to reset state in order to resume to parse loop */
+    return this.resumeAfterRecovery();
+  }
+  protected static int tAction(int state, int sym) {
+    return action[check(state + sym) == sym ? state + sym : state];
+  }
+  public String toString() {
+
+    String s = "identifierStack : char[][] = {"; //$NON-NLS-1$
+    for (int i = 0; i <= identifierPtr; i++) {
+      s = s + "\"" + String.valueOf(identifierStack[i]) + "\","; //$NON-NLS-1$ //$NON-NLS-2$
+    };
+    s = s + "}\n"; //$NON-NLS-1$
+
+    s = s + "identierLengthStack : int[] = {"; //$NON-NLS-1$
+    for (int i = 0; i <= identifierLengthPtr; i++) {
+      s = s + identifierLengthStack[i] + ","; //$NON-NLS-1$
+    };
+    s = s + "}\n"; //$NON-NLS-1$
+
+    s = s + "astLengthStack : int[] = {"; //$NON-NLS-1$
+    for (int i = 0; i <= astLengthPtr; i++) {
+      s = s + astLengthStack[i] + ","; //$NON-NLS-1$
+    };
+    s = s + "}\n"; //$NON-NLS-1$
+    s = s + "astPtr : int = " + String.valueOf(astPtr) + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
+
+    s = s + "intStack : int[] = {"; //$NON-NLS-1$
+    for (int i = 0; i <= intPtr; i++) {
+      s = s + intStack[i] + ","; //$NON-NLS-1$
+    };
+    s = s + "}\n"; //$NON-NLS-1$
+
+    s = s + "expressionLengthStack : int[] = {"; //$NON-NLS-1$
+    for (int i = 0; i <= expressionLengthPtr; i++) {
+      s = s + expressionLengthStack[i] + ","; //$NON-NLS-1$
+    };
+    s = s + "}\n"; //$NON-NLS-1$
+
+    s = s + "expressionPtr : int = " + String.valueOf(expressionPtr) + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
+
+    s = s + "\n\n\n----------------Scanner--------------\n" + scanner.toString(); //$NON-NLS-1$
+    return s;
+
+  }
+  /*
+   * Update recovery state based on current parser/scanner state
+   */
+  protected void updateRecoveryState() {
+
+    /* expose parser state to recovery state */
+    currentElement.updateFromParserState();
+
+    /* check and update recovered state based on current token,
+       this action is also performed when shifting token after recovery
+       got activated once. 
+    */
+    this.recoveryTokenCheck();
+  }
+  protected void updateSourceDeclarationParts(int variableDeclaratorsCounter) {
+    //fields is a definition of fields that are grouped together like in
+    //public int[] a, b[], c
+    //which results into 3 fields.
+
+    FieldDeclaration field;
+    int endTypeDeclarationPosition = -1 + astStack[astPtr - variableDeclaratorsCounter + 1].sourceStart;
+    for (int i = 0; i < variableDeclaratorsCounter - 1; i++) {
+      //last one is special(see below)
+      field = (FieldDeclaration) astStack[astPtr - i - 1];
+      field.endPart1Position = endTypeDeclarationPosition;
+      field.endPart2Position = -1 + astStack[astPtr - i].sourceStart;
+    }
+    //last one
+     (field = (FieldDeclaration) astStack[astPtr]).endPart1Position = endTypeDeclarationPosition;
+    field.endPart2Position = field.declarationSourceEnd;
+
+  }
+  protected void updateSourcePosition(Expression exp) {
+    //update the source Position of the expression
+
+    //intStack : int int
+    //-->
+    //intStack : 
+
+    exp.sourceEnd = intStack[intPtr--];
+    exp.sourceStart = intStack[intPtr--];
+  }
 }