removed Makefile; lifted repo/org.ibex.tool/src/ to src/
[org.ibex.tool.git] / src / org / eclipse / jdt / internal / compiler / parser / Parser.java
diff --git a/src/org/eclipse/jdt/internal/compiler/parser/Parser.java b/src/org/eclipse/jdt/internal/compiler/parser/Parser.java
new file mode 100644 (file)
index 0000000..81fd8d4
--- /dev/null
@@ -0,0 +1,6244 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Tom Tromey - patch for readTable(String) as described in http://bugs.eclipse.org/bugs/show_bug.cgi?id=32196
+ *******************************************************************************/
+package org.eclipse.jdt.internal.compiler.parser;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.core.compiler.InvalidInputException;
+import org.eclipse.jdt.internal.compiler.CompilationResult;
+import org.eclipse.jdt.internal.compiler.ast.*;
+import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
+import org.eclipse.jdt.internal.compiler.lookup.BindingIds;
+import org.eclipse.jdt.internal.compiler.lookup.CompilerModifiers;
+import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
+import org.eclipse.jdt.internal.compiler.parser.diagnose.DiagnoseParser;
+import org.eclipse.jdt.internal.compiler.problem.AbortCompilation;
+import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
+import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
+import org.eclipse.jdt.internal.compiler.util.Util;
+
+public class Parser implements BindingIds, ParserBasicInformation, TerminalTokens, CompilerModifiers, OperatorIds, TypeIds {
+       protected ProblemReporter problemReporter;
+       protected CompilerOptions options;
+       public int firstToken ; // handle for multiple parsing goals
+       public int lastAct ; //handle for multiple parsing goals
+       public ReferenceContext referenceContext;
+       public int currentToken;
+       private int synchronizedBlockSourceStart;
+
+       //error recovery management
+       protected int lastCheckPoint;
+       protected RecoveredElement currentElement;
+       public static boolean VERBOSE_RECOVERY = false;
+       protected boolean restartRecovery;
+       protected int listLength; // for recovering some incomplete list (interfaces, throws or parameters)
+       protected boolean hasError;
+       protected boolean hasReportedError;
+       public boolean reportSyntaxErrorIsRequired = true;
+       public boolean reportOnlyOneSyntaxError = false;
+       protected int recoveredStaticInitializerStart;
+       protected int lastIgnoredToken, nextIgnoredToken;
+       protected int lastErrorEndPosition;
+       protected boolean ignoreNextOpeningBrace;
+               
+       //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 , .... (int stacks)
+       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 !
+       protected int rBraceStart, rBraceEnd, rBraceSuccessorStart; //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;
+
+       // javadoc
+       public JavadocParser javadocParser;
+       public Javadoc javadoc;
+       
+       public static byte rhs[] = null;
+       public static char asb[] = null;
+       public static char asr[] = null;
+       public static char nasb[] = null;
+       public static char nasr[] = null;
+
+       public static char terminal_index[] = null;
+       public static char non_terminal_index[] = null;
+       
+       public static char term_action[] = null;
+       public static byte term_check[] = null;
+
+       private static final String UNEXPECTED_EOF = "Unexpected End Of File" ; //$NON-NLS-1$
+       private static final String INVALID_CHARACTER = "Invalid Character" ; //$NON-NLS-1$
+       private static final String EOF_TOKEN = "$eof" ; //$NON-NLS-1$
+       private static final String ERROR_TOKEN = "$error" ; //$NON-NLS-1$
+
+       public static String name[] = null;
+       public static String readableName[] = null;
+    
+       public static short check_table[] = null;
+       public static char lhs[] =  null;
+       public static char base_action[] = lhs;
+       
+       public static char scope_prefix[] = null;
+    public static char scope_suffix[] = null;
+    public static char scope_lhs[] = null;
+    
+    public static byte scope_la[] = null;
+
+    public static char scope_state_set[] = null;
+    public static char scope_rhs[] = null;
+    public static char scope_state[] = null;
+    public static char in_symb[] = null;
+    
+       private final static String FILEPREFIX = "parser"; //$NON-NLS-1$
+       private final static String READABLE_NAMES_FILE = "readableNames"; //$NON-NLS-1$
+       private final static String READABLE_NAMES =
+               "org.eclipse.jdt.internal.compiler.parser." + READABLE_NAMES_FILE; //$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) {
+               
+       this.problemReporter = problemReporter;
+       this.options = problemReporter.options;
+       this.optimizeStringLiterals = optimizeStringLiterals;
+       this.initializeScanner();
+       this.astLengthStack = new int[50];
+       this.expressionLengthStack = new int[30];
+       this.intStack = new int[50];
+       this.identifierStack = new char[30][];
+       this.identifierLengthStack = new int[30];
+       this.nestedMethod = new int[30];
+       this.realBlockStack = new int[30];
+       this.identifierPositionStack = new long[30];
+       this.variablesCounter = new int[30];
+       
+       // javadoc support
+       this.javadocParser = new JavadocParser(this);   
+}
+/**
+ *
+ * INTERNAL USE-ONLY
+ */
+protected void adjustInterfaceModifiers() {
+       this.intStack[this.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, 
+       // in other words, it has not been decremented yet.
+
+       ArrayInitializer ai = new ArrayInitializer();
+       if (length != 0) {
+               this.expressionPtr -= length;
+               System.arraycopy(this.expressionStack, this.expressionPtr + 1, ai.expressions = new Expression[length], 0, length);
+       }
+       pushOnExpressionStack(ai);
+       //positionning
+       ai.sourceEnd = this.endStatementPosition;
+       int searchPosition = length == 0 ? this.endPosition + 1 : ai.expressions[0].sourceStart;
+       try {
+               //does not work with comments(that contain '{') nor '{' describes as a unicode....              
+               while (this.scanner.source[--searchPosition] != '{'){/*empty*/}
+       } catch (IndexOutOfBoundsException ex) {
+               //should never occur (except for strange cases like whose describe above)
+               searchPosition = (length == 0 ? this.endPosition : ai.expressions[0].sourceStart) - 1;
+       }
+       ai.sourceStart = searchPosition;
+}
+public 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
+       this.realBlockStack[this.realBlockPtr]++;
+}
+private final static void buildFileOfByteFor(String filename, String tag, String[] tokens) 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)){/*empty*/}
+       //read upto the }
+       
+       byte[] bytes = new byte[tokens.length]; //can't be bigger
+       int ic = 0;
+       String token;
+       while (!(token = tokens[i++]).equals("}")) { //$NON-NLS-1$
+               int c = Integer.parseInt(token);
+               bytes[ic++] = (byte) c;
+       }
+
+       //resize
+       System.arraycopy(bytes, 0, bytes = new byte[ic], 0, ic);
+
+       buildFileForTable(filename, bytes);
+}
+private final static char[] buildFileOfIntFor(String filename, String tag, String[] tokens) 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)){/*empty*/}
+       //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);
+               chars[ic++] = (char) c;
+       }
+
+       //resize
+       System.arraycopy(chars, 0, chars = new char[ic], 0, ic);
+
+       buildFileForTable(filename, chars);
+       return chars;
+}
+private final static void buildFileOfShortFor(String filename, String tag, String[] tokens) 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)){/*empty*/}
+       //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);
+               chars[ic++] = (char) (c + 32768);
+       }
+
+       //resize
+       System.arraycopy(chars, 0, chars = new char[ic], 0, ic);
+
+       buildFileForTable(filename, chars);
+}
+private final static String[] buildFileForName(String filename, String contents) throws java.io.IOException {
+       String[] result = new String[contents.length()];
+       result[0] = null;
+       int resultCount = 1;
+       
+       StringBuffer buffer = new StringBuffer();
+       
+       int start = contents.indexOf("name[]"); //$NON-NLS-1$
+       start = contents.indexOf('\"', start); 
+       int end = contents.indexOf("};", start); //$NON-NLS-1$
+       
+       contents = contents.substring(start, end);
+       
+       boolean addLineSeparator = false;
+       int tokenStart = -1;
+       StringBuffer currentToken = new StringBuffer();
+       for (int i = 0; i < contents.length(); i++) {
+               char c = contents.charAt(i);
+               if(c == '\"') {
+                       if(tokenStart == -1) {
+                               tokenStart = i + 1;     
+                       } else {
+                               if(addLineSeparator) {
+                                       buffer.append('\n');
+                                       result[resultCount++] = currentToken.toString();
+                                       currentToken = new StringBuffer();
+                               }
+                               String token = contents.substring(tokenStart, i);
+                               if(token.equals(ERROR_TOKEN)){
+                                       token = INVALID_CHARACTER;
+                               } else if(token.equals(EOF_TOKEN)) {
+                                       token = UNEXPECTED_EOF;
+                               }
+                               buffer.append(token);
+                               currentToken.append(token);
+                               addLineSeparator = true;
+                               tokenStart = -1;
+                       }
+               }
+               if(tokenStart == -1 && c == '+'){
+                       addLineSeparator = false;
+               }
+       }
+       if(currentToken.length() > 0) {
+               result[resultCount++] = currentToken.toString();
+       }
+       
+       buildFileForTable(filename, buffer.toString().toCharArray());
+       
+       System.arraycopy(result, 0, result = new String[resultCount], 0, resultCount);
+       return result;
+}
+private static void buildFileForReadableName(
+       String file,
+       char[] newLhs,
+       char[] newNonTerminalIndex,
+       String[] newName,
+       String[] tokens) throws java.io.IOException {
+
+       ArrayList entries = new ArrayList();
+       
+       boolean[] alreadyAdded = new boolean[newName.length];
+       
+       for (int i = 0; i < tokens.length; i = i + 2) {
+               int index = newNonTerminalIndex[newLhs[Integer.parseInt(tokens[i])]];
+               StringBuffer buffer = new StringBuffer();
+               if(!alreadyAdded[index]) {
+                       alreadyAdded[index] = true;
+                       buffer.append(newName[index]);
+                       buffer.append('=');
+                       buffer.append(tokens[i+1].trim());
+                       buffer.append('\n');
+                       entries.add(String.valueOf(buffer));
+               }
+       }
+       int i = 1;
+       while(!INVALID_CHARACTER.equals(newName[i])) i++;
+       i++;
+       for (; i < alreadyAdded.length; i++) {
+               if(!alreadyAdded[i]) {
+                       System.out.println(newName[i] + " has no readable name"); //$NON-NLS-1$
+               }
+       }
+       Collections.sort(entries);
+       buildFile(file, entries);
+}
+private final static void buildFile(String filename, List listToDump) throws java.io.IOException {
+       BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
+       for (Iterator iterator = listToDump.iterator(); iterator.hasNext(); ) {
+               writer.write(String.valueOf(iterator.next()));
+       }
+       writer.flush();
+       writer.close();
+       System.out.println(filename + " creation complete"); //$NON-NLS-1$
+}
+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$
+}
+private final static void buildFileForTable(String filename, byte[] bytes) throws java.io.IOException {
+       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, String dataFilename2)  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;
+       
+       char[] newLhs = buildFileOfIntFor(prefix + (++i) + ".rsc", "lhs", tokens); //$NON-NLS-1$ //$NON-NLS-2$
+       buildFileOfShortFor(prefix + (++i) + ".rsc", "check_table", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       buildFileOfIntFor(prefix + (++i) + ".rsc", "asb", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       buildFileOfIntFor(prefix + (++i) + ".rsc", "asr", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       buildFileOfIntFor(prefix + (++i) + ".rsc", "nasb", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       buildFileOfIntFor(prefix + (++i) + ".rsc", "nasr", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       buildFileOfIntFor(prefix + (++i) + ".rsc", "terminal_index", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       char[] newNonTerminalIndex = buildFileOfIntFor(prefix + (++i) + ".rsc", "non_terminal_index", tokens); //$NON-NLS-1$ //$NON-NLS-2$
+       buildFileOfIntFor(prefix + (++i) + ".rsc", "term_action", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       
+       buildFileOfIntFor(prefix + (++i) + ".rsc", "scope_prefix", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       buildFileOfIntFor(prefix + (++i) + ".rsc", "scope_suffix", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       buildFileOfIntFor(prefix + (++i) + ".rsc", "scope_lhs", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       buildFileOfIntFor(prefix + (++i) + ".rsc", "scope_state_set", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       buildFileOfIntFor(prefix + (++i) + ".rsc", "scope_rhs", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       buildFileOfIntFor(prefix + (++i) + ".rsc", "scope_state", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       buildFileOfIntFor(prefix + (++i) + ".rsc", "in_symb", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       
+       buildFileOfByteFor(prefix + (++i) + ".rsc", "rhs", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       buildFileOfByteFor(prefix + (++i) + ".rsc", "term_check", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       buildFileOfByteFor(prefix + (++i) + ".rsc", "scope_la", tokens); //$NON-NLS-2$ //$NON-NLS-1$
+       
+       String[] newName = buildFileForName(prefix + (++i) + ".rsc", new String(contents)); //$NON-NLS-1$
+       
+       contents = new char[] {};
+       try {
+               contents = Util.getFileCharContent(new File(dataFilename2), null);
+       } catch (IOException ex) {
+               System.out.println(Util.bind("parser.incorrectPath")); //$NON-NLS-1$
+               return;
+       }
+       st = new java.util.StringTokenizer(new String(contents), "\t\n\r=");  //$NON-NLS-1$
+       tokens = new String[st.countTokens()];
+       i = 0;
+       while (st.hasMoreTokens()) {
+               tokens[i++] = st.nextToken();
+       }
+       buildFileForReadableName(READABLE_NAMES_FILE+".properties", newLhs, newNonTerminalIndex, newName, tokens);//$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 
+        */
+       this.lastCheckPoint = 0;
+
+       RecoveredElement element = null;
+       if (this.referenceContext instanceof CompilationUnitDeclaration){
+               element = new RecoveredUnit(this.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
+                       this.compilationUnit.currentPackage = null;
+                       this.compilationUnit.imports = null;
+                       this.compilationUnit.types = null;
+                       this.currentToken = 0;
+                       this.listLength = 0;
+                       this.endPosition = 0;
+                       this.endStatementPosition = 0;
+                       return element;
+               }
+               if (this.compilationUnit.currentPackage != null){
+                       this.lastCheckPoint = this.compilationUnit.currentPackage.declarationSourceEnd+1;
+               }
+               if (this.compilationUnit.imports != null){
+                       this.lastCheckPoint = this.compilationUnit.imports[this.compilationUnit.imports.length -1].declarationSourceEnd+1;              
+               }
+       } else {
+               if (this.referenceContext instanceof AbstractMethodDeclaration){
+                       element = new RecoveredMethod((AbstractMethodDeclaration) this.referenceContext, null, 0, this);
+                       this.lastCheckPoint = ((AbstractMethodDeclaration) this.referenceContext).bodyStart;
+               } else {
+                       /* Initializer bodies are parsed in the context of the type declaration, we must thus search it inside */
+                       if (this.referenceContext instanceof TypeDeclaration){
+                               TypeDeclaration type = (TypeDeclaration) this.referenceContext;
+                               for (int i = 0; i < type.fields.length; i++){
+                                       FieldDeclaration field = type.fields[i];                                        
+                                       if (field != null
+                                               && !field.isField()
+                                               && field.declarationSourceStart <= this.scanner.initialPosition
+                                               && this.scanner.initialPosition <= field.declarationSourceEnd
+                                               && this.scanner.eofPosition <= field.declarationSourceEnd+1){
+                                               element = new RecoveredInitializer(field, null, 1, this);
+                                               this.lastCheckPoint = field.declarationSourceStart;                                     
+                                               break;
+                                       }
+                               }
+                       } 
+               }
+       }
+
+       if (element == null) return element;
+       
+       for(int i = 0; i <= this.astPtr; i++){
+               ASTNode node = this.astStack[i];
+               if (node instanceof AbstractMethodDeclaration){
+                       AbstractMethodDeclaration method = (AbstractMethodDeclaration) node;
+                       if (method.declarationSourceEnd == 0){
+                               element = element.add(method, 0);
+                               this.lastCheckPoint = method.bodyStart;
+                       } else {
+                               element = element.add(method, 0);
+                               this.lastCheckPoint = method.declarationSourceEnd + 1;
+                       }
+                       continue;
+               }
+               if (node instanceof Initializer){
+                       Initializer initializer = (Initializer) node;
+                       if (initializer.declarationSourceEnd == 0){
+                               element = element.add(initializer, 1);
+                               this.lastCheckPoint = initializer.sourceStart;                          
+                       } else {
+                               element = element.add(initializer, 0);
+                               this.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){
+                                       this.lastCheckPoint = field.sourceEnd + 1;
+                               } else {
+                                       this.lastCheckPoint = field.initialization.sourceEnd + 1;
+                               }
+                       } else {
+                               element = element.add(field, 0);
+                               this.lastCheckPoint = field.declarationSourceEnd + 1;
+                       }
+                       continue;
+               }
+               if (node instanceof TypeDeclaration){
+                       TypeDeclaration type = (TypeDeclaration) node;
+                       if (type.declarationSourceEnd == 0){
+                               element = element.add(type, 0); 
+                               this.lastCheckPoint = type.bodyStart;
+                       } else {
+                               element = element.add(type, 0);                         
+                               this.lastCheckPoint = type.declarationSourceEnd + 1;
+                       }
+                       continue;
+               }
+               if (node instanceof ImportReference){
+                       ImportReference importRef = (ImportReference) node;
+                       element = element.add(importRef, 0);
+                       this.lastCheckPoint = importRef.declarationSourceEnd + 1;
+               }
+       }
+       return element;
+}
+public final static short base_check(int i) {
+       return check_table[i - (NUM_RULES + 1)];
+}
+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 ((this.modifiers & flag) != 0){ // duplicate modifier
+               this.modifiers |= AccAlternateModifierProblem;
+       }
+       this.modifiers |= flag;
+                       
+       if (this.modifiersSourceStart < 0) this.modifiersSourceStart = this.scanner.startPosition;
+}
+public void checkComment() {
+
+       if (this.currentElement != null && this.scanner.commentPtr >= 0) {
+               flushCommentsDefinedPriorTo(this.endStatementPosition); // discard obsolete comments during recovery
+       }
+       
+       int lastComment = this.scanner.commentPtr;
+       
+       if (this.modifiersSourceStart >= 0) {
+               // eliminate comments located after modifierSourceStart if positionned
+               while (lastComment >= 0 && this.scanner.commentStarts[lastComment] > this.modifiersSourceStart) lastComment--;
+       }
+       if (lastComment >= 0) {
+               // consider all remaining leading comments to be part of current declaration
+               this.modifiersSourceStart = this.scanner.commentStarts[0]; 
+       
+               // check deprecation in last comment if javadoc (can be followed by non-javadoc comments which are simply ignored)      
+               while (lastComment >= 0 && this.scanner.commentStops[lastComment] < 0) lastComment--; // non javadoc comment have negative end positions
+               if (lastComment >= 0 && this.javadocParser != null) {
+                       if (this.javadocParser.checkDeprecation(
+                                       this.scanner.commentStarts[lastComment],
+                                       this.scanner.commentStops[lastComment] - 1)) { //stop is one over,
+                               checkAndSetModifiers(AccDeprecated);
+                       }
+                       this.javadoc = this.javadocParser.docComment;   // null if check javadoc is not activated 
+               }
+       }
+}
+protected void checkNonExternalizedStringLiteral() {
+       if (this.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]);
+                       }
+               }
+               this.scanner.wasNonExternalizedStringLiteral = false;
+       }
+}
+protected void checkNonNLSAfterBodyEnd(int declarationEnd){
+       if(this.scanner.currentPosition - 1 <= declarationEnd) {
+               this.scanner.eofPosition = declarationEnd < Integer.MAX_VALUE ? declarationEnd + 1 : declarationEnd;
+               try {
+                       while(this.scanner.getNextToken() != TokenNameEOF){/*empty*/}
+                       checkNonExternalizedStringLiteral();
+               } catch (InvalidInputException e) {
+                       // Nothing to do
+               }
+       }
+}
+protected char getNextCharacter(char[] comment, int[] index) {
+       char nextCharacter = comment[index[0]++];
+       switch(nextCharacter) {
+               case '\\' :
+                       int c1, c2, c3, c4;
+                       index[0]++;
+                       while (comment[index[0]] == 'u') index[0]++;
+                       if (!(((c1 = Character.getNumericValue(comment[index[0]++])) > 15
+                               || c1 < 0)
+                               || ((c2 = Character.getNumericValue(comment[index[0]++])) > 15 || c2 < 0)
+                               || ((c3 = Character.getNumericValue(comment[index[0]++])) > 15 || c3 < 0)
+                               || ((c4 = Character.getNumericValue(comment[index[0]++])) > 15 || c4 < 0))) {
+                                       nextCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
+                       }
+                       break;
+       }
+       return nextCharacter;
+}
+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 = this.astLengthStack[this.astLengthPtr--]) == 1)
+               && (this.astStack[this.astPtr] == null)) {
+               //NO ClassBody
+               this.astPtr--;
+               if (alwaysQualified) {
+                       alloc = new QualifiedAllocationExpression();
+               } else {
+                       alloc = new AllocationExpression();
+               }
+               alloc.sourceEnd = this.endPosition; //the position has been stored explicitly
+
+               if ((length = this.expressionLengthStack[this.expressionLengthPtr--]) != 0) {
+                       this.expressionPtr -= length;
+                       System.arraycopy(
+                               this.expressionStack, 
+                               this.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 = this.intStack[this.intPtr--];
+               pushOnExpressionStack(alloc);
+       } else {
+               dispatchDeclarationInto(length);
+               TypeDeclaration anonymousTypeDeclaration = (TypeDeclaration)this.astStack[this.astPtr];
+               anonymousTypeDeclaration.declarationSourceEnd = this.endStatementPosition;
+               anonymousTypeDeclaration.bodyEnd = this.endStatementPosition;
+               if (anonymousTypeDeclaration.allocation != null) {
+                       anonymousTypeDeclaration.allocation.sourceEnd = this.endStatementPosition;
+               }
+               if (length == 0 && !containsComment(anonymousTypeDeclaration.bodyStart, anonymousTypeDeclaration.bodyEnd)) {
+                       anonymousTypeDeclaration.bits |= ASTNode.UndocumentedEmptyBlockMASK;
+               }
+               this.astPtr--;
+               this.astLengthPtr--;
+               
+               // mark initializers with local type mark if needed
+               markInitializersWithLocalType(anonymousTypeDeclaration);
+       }
+}
+protected final void concatExpressionLists() {
+       this.expressionLengthStack[--this.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.
+        */
+
+       this.astLengthStack[this.astLengthPtr - 1] += this.astLengthStack[this.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 (this.currentElement == null){
+               return; // should never occur, this consumeRule is only used in recovery mode
+       }
+       if (this.currentToken == TokenNameLBRACE){
+               // beginning of an anonymous type
+               TypeDeclaration anonymousType = new TypeDeclaration(this.compilationUnit.compilationResult);
+               anonymousType.name = TypeDeclaration.ANONYMOUS_EMPTY_NAME;
+               anonymousType.bits |= ASTNode.AnonymousAndLocalMask;
+               anonymousType.sourceStart = this.intStack[this.intPtr--];
+               anonymousType.sourceEnd = this.rParenPos; // closing parenthesis
+               QualifiedAllocationExpression alloc = new QualifiedAllocationExpression(anonymousType);
+               alloc.type = getTypeReference(0);
+               alloc.sourceStart = anonymousType.sourceStart;
+               alloc.sourceEnd = anonymousType.sourceEnd ;
+               anonymousType.allocation = alloc; 
+               this.lastCheckPoint = anonymousType.bodyStart = this.scanner.currentPosition;
+               this.currentElement = this.currentElement.add(anonymousType, 0);
+               this.lastIgnoredToken = -1;
+               this.currentToken = 0; // opening brace already taken into account
+               return;
+       }
+       this.lastCheckPoint = this.scanner.startPosition; // force to restart at this exact position
+       this.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 = 
+                       this.expressionStack[this.expressionPtr] = 
+                               new ArrayReference(
+                                       getUnspecifiedReferenceOptimized(),
+                                       this.expressionStack[this.expressionPtr]);
+       } else {
+               this.expressionPtr--;
+               this.expressionLengthPtr--;
+               exp = 
+                       this.expressionStack[this.expressionPtr] = 
+                               new ArrayReference(
+                                       this.expressionStack[this.expressionPtr],
+                                       this.expressionStack[this.expressionPtr + 1]);
+       }
+       exp.sourceEnd = this.endPosition;
+}
+protected void consumeArrayCreationExpressionWithoutInitializer() {
+       // ArrayCreationWithoutArrayInitializer ::= 'new' ClassOrInterfaceType DimWithOrWithOutExprs
+       // ArrayCreationWithoutArrayInitializer ::= 'new' PrimitiveType DimWithOrWithOutExprs
+
+       int length;
+       ArrayAllocationExpression aae = new ArrayAllocationExpression();
+       aae.type = getTypeReference(0);
+       length = (this.expressionLengthStack[this.expressionLengthPtr--]);
+       this.expressionPtr -= length ;
+       System.arraycopy(
+               this.expressionStack,
+               this.expressionPtr+1,
+               aae.dimensions = new Expression[length],
+               0,
+               length);
+       aae.sourceStart = this.intStack[this.intPtr--];
+       if (aae.initializer == null) {
+               aae.sourceEnd = this.endPosition;
+       } else {
+               aae.sourceEnd = aae.initializer.sourceEnd ;
+       }
+       pushOnExpressionStack(aae);
+}
+
+protected void consumeArrayCreationHeader() {
+       // nothing to do
+}
+protected void consumeArrayCreationExpressionWithInitializer() {
+       // ArrayCreationWithArrayInitializer ::= 'new' PrimitiveType DimWithOrWithOutExprs ArrayInitializer
+       // ArrayCreationWithArrayInitializer ::= 'new' ClassOrInterfaceType DimWithOrWithOutExprs ArrayInitializer
+
+       int length;
+       ArrayAllocationExpression aae = new ArrayAllocationExpression();
+       this.expressionLengthPtr -- ;
+       aae.initializer = (ArrayInitializer) this.expressionStack[this.expressionPtr--];
+               
+       aae.type = getTypeReference(0);
+       length = (this.expressionLengthStack[this.expressionLengthPtr--]);
+       this.expressionPtr -= length ;
+       System.arraycopy(
+               this.expressionStack,
+               this.expressionPtr+1,
+               aae.dimensions = new Expression[length],
+               0,
+               length);
+       aae.sourceStart = this.intStack[this.intPtr--];
+       if (aae.initializer == null) {
+               aae.sourceEnd = this.endPosition;
+       } else {
+               aae.sourceEnd = aae.initializer.sourceEnd ;
+       }
+       pushOnExpressionStack(aae);
+}
+protected void consumeArrayInitializer() {
+       // ArrayInitializer ::= '{' VariableInitializers '}'
+       // ArrayInitializer ::= '{' VariableInitializers , '}'
+
+       arrayInitializer(this.expressionLengthStack[this.expressionLengthPtr--]);
+}
+
+protected void consumeAssertStatement() {
+       // AssertStatement ::= 'assert' Expression ':' Expression ';'
+       this.expressionLengthPtr-=2;
+       pushOnAstStack(new AssertStatement(this.expressionStack[this.expressionPtr--], this.expressionStack[this.expressionPtr--], this.intStack[this.intPtr--]));
+}
+
+protected void consumeAssignment() {
+       // Assignment ::= LeftHandSide AssignmentOperator AssignmentExpression
+       //optimize the push/pop
+
+       int op = this.intStack[this.intPtr--] ; //<--the encoded operator
+       
+       this.expressionPtr -- ; this.expressionLengthPtr -- ;
+       this.expressionStack[this.expressionPtr] =
+               (op != EQUAL ) ?
+                       new CompoundAssignment(
+                               this.expressionStack[this.expressionPtr] ,
+                               this.expressionStack[this.expressionPtr+1], 
+                               op,
+                               this.scanner.startPosition - 1) :
+                       new Assignment(
+                               this.expressionStack[this.expressionPtr] ,
+                               this.expressionStack[this.expressionPtr+1],
+                               this.scanner.startPosition - 1);
+}
+protected void consumeAssignmentOperator(int pos) {
+       // AssignmentOperator ::= '='
+       // AssignmentOperator ::= '*='
+       // AssignmentOperator ::= '/='
+       // AssignmentOperator ::= '%='
+       // AssignmentOperator ::= '+='
+       // AssignmentOperator ::= '-='
+       // AssignmentOperator ::= '<<='
+       // AssignmentOperator ::= '>>='
+       // AssignmentOperator ::= '>>>='
+       // AssignmentOperator ::= '&='
+       // AssignmentOperator ::= '^='
+       // AssignmentOperator ::= '|='
+
+       pushOnIntStack(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
+
+       this.expressionPtr--;
+       this.expressionLengthPtr--;
+       Expression expr1 = this.expressionStack[this.expressionPtr];
+       Expression expr2 = this.expressionStack[this.expressionPtr + 1];
+       switch(op) {
+               case OR_OR :
+                       this.expressionStack[this.expressionPtr] = 
+                               new OR_OR_Expression(
+                                       expr1, 
+                                       expr2, 
+                                       op); 
+                       break;
+               case AND_AND :
+                       this.expressionStack[this.expressionPtr] = 
+                               new AND_AND_Expression(
+                                       expr1, 
+                                       expr2, 
+                                       op);
+                       break;
+               case PLUS :
+                       // look for "string1" + "string2"
+                       if (this.optimizeStringLiterals) {
+                               if (expr1 instanceof StringLiteral) {
+                                       if (expr2 instanceof CharLiteral) { // string+char
+                                               this.expressionStack[this.expressionPtr] = 
+                                                       ((StringLiteral) expr1).extendWith((CharLiteral) expr2); 
+                                       } else if (expr2 instanceof StringLiteral) { //string+string
+                                               this.expressionStack[this.expressionPtr] = 
+                                                       ((StringLiteral) expr1).extendWith((StringLiteral) expr2); 
+                                       } else {
+                                               this.expressionStack[this.expressionPtr] = new BinaryExpression(expr1, expr2, PLUS);
+                                       }
+                               } else {
+                                       this.expressionStack[this.expressionPtr] = new BinaryExpression(expr1, expr2, PLUS);
+                               }
+                       } else if (expr1 instanceof StringLiteral) {
+                               if (expr2 instanceof StringLiteral) {
+                                       // string + string
+                                       this.expressionStack[this.expressionPtr] = 
+                                               ((StringLiteral) expr1).extendsWith((StringLiteral) expr2); 
+                               } else {
+                                       this.expressionStack[this.expressionPtr] = 
+                                               new BinaryExpression(
+                                                       expr1, 
+                                                       expr2, 
+                                                       op);
+                               }
+                       } else {
+                               this.expressionStack[this.expressionPtr] = 
+                                       new BinaryExpression(
+                                               expr1, 
+                                               expr2, 
+                                               op);
+                       }
+                       break;
+               default :
+                       this.expressionStack[this.expressionPtr] = 
+                               new BinaryExpression(
+                                       expr1, 
+                                       expr2, 
+                                       op);            
+       }
+}
+protected void consumeBlock() {
+       // Block ::= OpenBlock '{' BlockStatementsopt '}'
+       // simpler action for empty blocks
+
+       int statementsLength = this.astLengthStack[this.astLengthPtr--];
+       Block block;
+       if (statementsLength == 0) { // empty block 
+               block = new Block(0);
+               block.sourceStart = this.intStack[this.intPtr--];
+               block.sourceEnd = this.endStatementPosition;
+               // check whether this block at least contains some comment in it
+               if (!containsComment(block.sourceStart, block.sourceEnd)) {
+                       block.bits |= ASTNode.UndocumentedEmptyBlockMASK;
+               }
+               this.realBlockPtr--; // still need to pop the block variable counter
+       } else {
+               block = new Block(this.realBlockStack[this.realBlockPtr--]);
+               this.astPtr -= statementsLength;
+               System.arraycopy(
+                       this.astStack, 
+                       this.astPtr + 1, 
+                       block.statements = new Statement[statementsLength], 
+                       0, 
+                       statementsLength); 
+               block.sourceStart = this.intStack[this.intPtr--];
+               block.sourceEnd = this.endStatementPosition;
+       }
+       pushOnAstStack(block);
+}
+protected void consumeBlockStatements() {
+       // BlockStatements ::= BlockStatements BlockStatement
+       concatNodeLists();
+}
+protected void consumeCaseLabel() {
+       // SwitchLabel ::= 'case' ConstantExpression ':'
+       this.expressionLengthPtr--;
+       Expression expression = this.expressionStack[this.expressionPtr--];
+       pushOnAstStack(new CaseStatement(expression, expression.sourceEnd, this.intStack[this.intPtr--]));
+}
+protected void consumeCastExpression() {
+       // CastExpression ::= PushLPAREN PrimitiveType Dimsopt PushRPAREN InsideCastExpression UnaryExpression
+       // CastExpression ::= PushLPAREN Name Dims PushRPAREN InsideCastExpression UnaryExpressionNotPlusMinus
+
+       //this.intStack : posOfLeftParen dim posOfRightParen
+
+       //optimize the push/pop
+
+       Expression exp, cast, castType;
+       int end = this.intStack[this.intPtr--];
+       this.expressionStack[this.expressionPtr] = cast = new CastExpression(exp = this.expressionStack[this.expressionPtr], castType = getTypeReference(this.intStack[this.intPtr--]));
+       castType.sourceEnd = end - 1;
+       castType.sourceStart = (cast.sourceStart = this.intStack[this.intPtr--]) + 1;
+       cast.sourceEnd = exp.sourceEnd;
+}
+protected void consumeCastExpressionLL1() {
+       //CastExpression ::= '(' Expression ')' InsideCastExpressionLL1 UnaryExpressionNotPlusMinus
+       // Expression is used in order to make the grammar LL1
+
+       //optimize push/pop
+
+       Expression cast,exp;
+       this.expressionPtr--;
+       this.expressionStack[this.expressionPtr] = 
+               cast = new CastExpression(
+                       exp=this.expressionStack[this.expressionPtr+1] ,
+                       getTypeReference(this.expressionStack[this.expressionPtr]));
+       this.expressionLengthPtr -- ;
+       updateSourcePosition(cast);
+       cast.sourceEnd=exp.sourceEnd;
+}
+protected void consumeCatches() {
+       // Catches ::= Catches CatchClause
+       optimizedConcatNodeLists();
+}
+protected void consumeCatchHeader() {
+       // CatchDeclaration ::= 'catch' '(' FormalParameter ')' '{'
+
+       if (this.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 (!(this.currentElement instanceof RecoveredBlock)){
+               if(!(this.currentElement instanceof RecoveredMethod)) {
+                       return;
+               }
+               RecoveredMethod rMethod = (RecoveredMethod) this.currentElement;
+               if(!(rMethod.methodBody == null && rMethod.bracketBalance > 0)) {
+                       return;
+               }
+       }
+       
+       Argument arg = (Argument)this.astStack[this.astPtr--];
+       // convert argument to local variable
+       LocalDeclaration localDeclaration = new LocalDeclaration(arg.name, arg.sourceStart, arg.sourceEnd);
+       localDeclaration.type = arg.type;
+       localDeclaration.declarationSourceStart = arg.declarationSourceStart;
+       localDeclaration.declarationSourceEnd = arg.declarationSourceEnd;
+       
+       this.currentElement = this.currentElement.add(localDeclaration, 0);
+       this.lastCheckPoint = this.scanner.startPosition; // force to restart at this exact position
+       this.restartRecovery = true; // request to restart from here on
+       this.lastIgnoredToken = -1;
+}
+protected void consumeClassBodyDeclaration() {
+       // ClassBodyDeclaration ::= Diet Block
+       //push an Initializer
+       //optimize the push/pop
+       this.nestedMethod[this.nestedType]--;
+       Block block = (Block) this.astStack[this.astPtr];
+       if (this.diet) block.bits &= ~ASTNode.UndocumentedEmptyBlockMASK; // clear bit since was diet
+       Initializer initializer = new Initializer(block, 0);
+       this.intPtr--; // pop sourcestart left on the stack by consumeNestedMethod.
+       initializer.bodyStart = this.intStack[this.intPtr--];
+       this.realBlockPtr--; // pop the block variable counter left on the stack by consumeNestedMethod
+       int javadocCommentStart = this.intStack[this.intPtr--];
+       if (javadocCommentStart != -1) {
+               initializer.declarationSourceStart = javadocCommentStart;
+               initializer.javadoc = this.javadoc;
+               this.javadoc = null;
+       }
+       this.astStack[this.astPtr] = initializer;
+       initializer.bodyEnd = this.endPosition;
+       initializer.sourceEnd = this.endStatementPosition;
+       initializer.declarationSourceEnd = flushCommentsDefinedPriorTo(this.endStatementPosition);
+}
+protected void consumeClassBodyDeclarations() {
+       // ClassBodyDeclarations ::= ClassBodyDeclarations ClassBodyDeclaration
+       concatNodeLists();
+}
+protected void consumeClassBodyDeclarationsopt() {
+       // ClassBodyDeclarationsopt ::= NestedType ClassBodyDeclarations
+       this.nestedType-- ;
+}
+protected void consumeClassBodyopt() {
+       // ClassBodyopt ::= $empty
+       pushOnAstStack(null);
+       this.endPosition = this.scanner.startPosition - 1;
+}
+protected void consumeClassDeclaration() {
+       // ClassDeclaration ::= ClassHeader ClassBody
+
+       int length;
+       if ((length = this.astLengthStack[this.astLengthPtr--]) != 0) {
+               //there are length declarations
+               //dispatch according to the type of the declarations
+               dispatchDeclarationInto(length);
+       }
+
+       TypeDeclaration typeDecl = (TypeDeclaration) this.astStack[this.astPtr];
+
+       // mark initializers with local type mark if needed
+       markInitializersWithLocalType(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 && !typeDecl.isInterface()) {
+               boolean insideFieldInitializer = false;
+               if (this.diet) {
+                       for (int i = this.nestedType; i > 0; i--){
+                               if (this.variablesCounter[i] > 0) {
+                                       insideFieldInitializer = true;
+                                       break;
+                               }
+                       }
+               }
+               typeDecl.createsInternalConstructor(!this.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 = this.endStatementPosition;
+       if (length == 0 && !containsComment(typeDecl.bodyStart, typeDecl.bodyEnd)) {
+               typeDecl.bits |= ASTNode.UndocumentedEmptyBlockMASK;
+       }
+
+       typeDecl.declarationSourceEnd = flushCommentsDefinedPriorTo(this.endStatementPosition); 
+}
+protected void consumeClassHeader() {
+       // ClassHeader ::= ClassHeaderName ClassHeaderExtendsopt ClassHeaderImplementsopt
+
+       TypeDeclaration typeDecl = (TypeDeclaration) this.astStack[this.astPtr];        
+       if (this.currentToken == TokenNameLBRACE) { 
+               typeDecl.bodyStart = this.scanner.currentPosition;
+       }
+       if (this.currentElement != null) {
+               this.restartRecovery = true; // used to avoid branching back into the regular automaton         
+       }
+       // flush the comments related to the class header
+       this.scanner.commentPtr = -1;
+}
+protected void consumeClassHeaderExtends() {
+       // ClassHeaderExtends ::= 'extends' ClassType
+       // There is a class declaration on the top of stack
+       TypeDeclaration typeDecl = (TypeDeclaration) this.astStack[this.astPtr];
+       //superclass
+       typeDecl.superclass = getTypeReference(0);
+       typeDecl.bodyStart = typeDecl.superclass.sourceEnd + 1;
+       // recovery
+       if (this.currentElement != null){
+               this.lastCheckPoint = typeDecl.bodyStart;
+       }
+}
+protected void consumeClassHeaderImplements() {
+       // ClassHeaderImplements ::= 'implements' InterfaceTypeList
+       int length = this.astLengthStack[this.astLengthPtr--];
+       //super interfaces
+       this.astPtr -= length;
+       // There is a class declaration on the top of stack
+       TypeDeclaration typeDecl = (TypeDeclaration) this.astStack[this.astPtr];
+       System.arraycopy(
+               this.astStack, 
+               this.astPtr + 1, 
+               typeDecl.superInterfaces = new TypeReference[length], 
+               0, 
+               length); 
+       typeDecl.bodyStart = typeDecl.superInterfaces[length-1].sourceEnd + 1;
+       this.listLength = 0; // reset after having read super-interfaces
+       // recovery
+       if (this.currentElement != null) { // is recovering
+               this.lastCheckPoint = typeDecl.bodyStart;
+       }
+}
+protected void consumeClassHeaderName() {
+       // ClassHeaderName ::= Modifiersopt 'class' 'Identifier'
+       TypeDeclaration typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult);
+       if (this.nestedMethod[this.nestedType] == 0) {
+               if (this.nestedType != 0) {
+                       typeDecl.bits |= ASTNode.IsMemberTypeMASK;
+               }
+       } else {
+               // Record that the block has a declaration for local types
+               typeDecl.bits |= ASTNode.IsLocalTypeMASK;
+               markEnclosingMemberWithLocalType();
+               blockReal();
+       }
+
+       //highlight the name of the type
+       long pos = this.identifierPositionStack[this.identifierPtr];
+       typeDecl.sourceEnd = (int) pos;
+       typeDecl.sourceStart = (int) (pos >>> 32);
+       typeDecl.name = this.identifierStack[this.identifierPtr--];
+       this.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 = this.intStack[this.intPtr--]; 
+       this.intPtr--; // remove the end position of the class token
+
+       typeDecl.modifiersSourceStart = this.intStack[this.intPtr--];
+       typeDecl.modifiers = this.intStack[this.intPtr--];
+       if (typeDecl.modifiersSourceStart >= 0) {
+               typeDecl.declarationSourceStart = typeDecl.modifiersSourceStart;
+       }
+       typeDecl.bodyStart = typeDecl.sourceEnd + 1;
+       pushOnAstStack(typeDecl);
+
+       this.listLength = 0; // will be updated when reading super-interfaces
+       // recovery
+       if (this.currentElement != null){ 
+               this.lastCheckPoint = typeDecl.bodyStart;
+               this.currentElement = this.currentElement.add(typeDecl, 0);
+               this.lastIgnoredToken = -1;
+       }
+       // javadoc
+       typeDecl.javadoc = this.javadoc;
+       this.javadoc = null;
+}
+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....
+
+       this.expressionLengthPtr--;
+       QualifiedAllocationExpression qae = 
+               (QualifiedAllocationExpression) this.expressionStack[this.expressionPtr--]; 
+       qae.enclosingInstance = this.expressionStack[this.expressionPtr];
+       this.expressionStack[this.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 */
+       this.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
+
+       this.expressionPtr -= 2;
+       this.expressionLengthPtr -= 2;
+       this.expressionStack[this.expressionPtr] =
+               new ConditionalExpression(
+                       this.expressionStack[this.expressionPtr],
+                       this.expressionStack[this.expressionPtr + 1],
+                       this.expressionStack[this.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 '}'
+       this.nestedMethod[this.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
+       this.intPtr--;
+       this.intPtr--;
+
+       //statements
+       this.realBlockPtr--;
+       ExplicitConstructorCall constructorCall = null;
+       Statement[] statements = null;
+       if ((length = this.astLengthStack[this.astLengthPtr--]) != 0) {
+               this.astPtr -= length;
+               if (this.astStack[this.astPtr + 1] instanceof ExplicitConstructorCall) {
+                       //avoid a isSomeThing that would only be used here BUT what is faster between two alternatives ?
+                       System.arraycopy(
+                               this.astStack, 
+                               this.astPtr + 2, 
+                               statements = new Statement[length - 1], 
+                               0, 
+                               length - 1); 
+                       constructorCall = (ExplicitConstructorCall) this.astStack[this.astPtr + 1];
+               } else { //need to add explicitly the super();
+                       System.arraycopy(
+                               this.astStack, 
+                               this.astPtr + 1, 
+                               statements = new Statement[length], 
+                               0, 
+                               length); 
+                       constructorCall = SuperReference.implicitSuperConstructorCall();
+               }
+       } else {
+               boolean insideFieldInitializer = false;
+               if (this.diet) {
+                       for (int i = this.nestedType; i > 0; i--){
+                               if (this.variablesCounter[i] > 0) {
+                                       insideFieldInitializer = true;
+                                       break;
+                               }
+                       }
+               }
+               
+               if (!this.diet || insideFieldInitializer){
+                       // 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) this.astStack[this.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;
+       }
+
+       if (!this.diet && (statements == null && constructorCall.isImplicitSuper())) {
+               if (!containsComment(cd.bodyStart, this.endPosition)) {
+                       cd.bits |= ASTNode.UndocumentedEmptyBlockMASK;
+               }
+       }
+
+       //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 = this.endPosition;
+       cd.declarationSourceEnd = flushCommentsDefinedPriorTo(this.endStatementPosition); 
+}
+
+protected void consumeInvalidConstructorDeclaration() {
+       // ConstructorDeclaration ::= ConstructorHeader ';'
+       // now we know that the top of stack is a constructorDeclaration
+       ConstructorDeclaration cd = (ConstructorDeclaration) this.astStack[this.astPtr];
+
+       cd.bodyEnd = this.endPosition; // position just before the trailing semi-colon
+       cd.declarationSourceEnd = flushCommentsDefinedPriorTo(this.endStatementPosition); 
+       // report the problem and continue the parsing - narrowing the problem onto the method
+       
+       cd.modifiers |= AccSemicolonBody; // remember semi-colon body
+}
+protected void consumeConstructorHeader() {
+       // ConstructorHeader ::= ConstructorHeaderName MethodHeaderParameters MethodHeaderThrowsClauseopt
+
+       AbstractMethodDeclaration method = (AbstractMethodDeclaration)this.astStack[this.astPtr];
+
+       if (this.currentToken == TokenNameLBRACE){ 
+               method.bodyStart = this.scanner.currentPosition;
+       }
+       // recovery
+       if (this.currentElement != null){
+               if (this.currentToken == TokenNameSEMICOLON){ // for invalid constructors
+                       method.modifiers |= AccSemicolonBody;                   
+                       method.declarationSourceEnd = this.scanner.currentPosition-1;
+                       method.bodyEnd = this.scanner.currentPosition-1;
+                       if (this.currentElement.parseTree() == method && this.currentElement.parent != null) {
+                               this.currentElement = this.currentElement.parent;
+                       }
+               }               
+               this.restartRecovery = true; // used to avoid branching back into the regular automaton
+       }               
+}
+protected void consumeConstructorHeaderName() {
+
+       /* recovering - might be an empty message send */
+       if (this.currentElement != null){
+               if (this.lastIgnoredToken == TokenNamenew){ // was an allocation expression
+                       this.lastCheckPoint = this.scanner.startPosition; // force to restart at this exact position                            
+                       this.restartRecovery = true;
+                       return;
+               }
+       }
+       
+       // ConstructorHeaderName ::=  Modifiersopt 'Identifier' '('
+       ConstructorDeclaration cd = new ConstructorDeclaration(this.compilationUnit.compilationResult);
+
+       //name -- this is not really revelant but we do .....
+       cd.selector = this.identifierStack[this.identifierPtr];
+       long selectorSource = this.identifierPositionStack[this.identifierPtr--];
+       this.identifierLengthPtr--;
+
+       //modifiers
+       cd.declarationSourceStart = this.intStack[this.intPtr--];
+       cd.modifiers = this.intStack[this.intPtr--];
+       // javadoc
+       cd.javadoc = this.javadoc;
+       this.javadoc = null;
+
+       //highlight starts at the selector starts
+       cd.sourceStart = (int) (selectorSource >>> 32);
+       pushOnAstStack(cd);
+       cd.sourceEnd = this.lParenPos;
+       cd.bodyStart = this.lParenPos+1;
+       this.listLength = 0; // initialize listLength before reading parameters/throws
+
+       // recovery
+       if (this.currentElement != null){
+               this.lastCheckPoint = cd.bodyStart;
+               if ((this.currentElement instanceof RecoveredType && this.lastIgnoredToken != TokenNameDOT)
+                       || cd.modifiers != 0){
+                       this.currentElement = this.currentElement.add(cd, 0);
+                       this.lastIgnoredToken = -1;
+               }
+       }       
+}
+protected void consumeDefaultLabel() {
+       // SwitchLabel ::= 'default' ':'
+       pushOnAstStack(new CaseStatement(null, this.intStack[this.intPtr--], this.intStack[this.intPtr--]));
+}
+protected void consumeDefaultModifiers() {
+       checkComment(); // might update modifiers with AccDeprecated
+       pushOnIntStack(this.modifiers); // modifiers
+       pushOnIntStack(
+               this.modifiersSourceStart >= 0 ? this.modifiersSourceStart : this.scanner.startPosition); 
+       resetModifiers();
+}
+protected void consumeDiet() {
+       // Diet ::= $empty
+       checkComment();
+       pushOnIntStack(this.modifiersSourceStart); // push the start position of a javadoc comment if there is one
+       resetModifiers();
+       jumpOverMethodBody();
+}
+protected void consumeDims() {
+       // Dims ::= DimsLoop
+       pushOnIntStack(this.dimensions);
+       this.dimensions = 0;
+}
+protected void consumeDimWithOrWithOutExpr() {
+       // DimWithOrWithOutExpr ::= '[' ']'
+       pushOnExpressionStack(null);
+       
+       if(this.currentElement != null && this.currentToken == TokenNameLBRACE) {
+               this.ignoreNextOpeningBrace = true;
+               this.currentElement.bracketBalance++; 
+       }
+}
+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);
+       problemReporter().superfluousSemicolon(this.endPosition+1, this.endStatementPosition);
+       flushCommentsDefinedPriorTo(this.endStatementPosition);
+}
+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[this.endStatementPosition] == ';') {
+               pushOnAstStack(new EmptyStatement(this.endStatementPosition, this.endStatementPosition));
+       } else {
+               // we have a Unicode for the ';' (/u003B)
+               pushOnAstStack(new EmptyStatement(this.endStatementPosition - 5, this.endStatementPosition));
+       }
+}
+protected void consumeEmptySwitchBlock() {
+       // SwitchBlock ::= '{' '}'
+       pushOnAstLengthStack(0);
+}
+protected void consumeEmptyTypeDeclaration() {
+       // TypeDeclaration ::= ';' 
+       pushOnAstLengthStack(0);
+       problemReporter().superfluousSemicolon(this.endPosition+1, this.endStatementPosition);
+       flushCommentsDefinedPriorTo(this.endStatementPosition);
+}
+protected void consumeEmptyTypeDeclarationsopt() {
+       // TypeDeclarationsopt ::= $empty
+       pushOnAstLengthStack(0); 
+}
+protected void consumeEnterAnonymousClassBody() {
+       // EnterAnonymousClassBody ::= $empty
+       QualifiedAllocationExpression alloc;
+       TypeDeclaration anonymousType = new TypeDeclaration(this.compilationUnit.compilationResult); 
+       anonymousType.name = TypeDeclaration.ANONYMOUS_EMPTY_NAME;
+       anonymousType.bits |= ASTNode.AnonymousAndLocalMask;
+       alloc = anonymousType.allocation = new QualifiedAllocationExpression(anonymousType); 
+       markEnclosingMemberWithLocalType();
+       pushOnAstStack(anonymousType);
+
+       alloc.sourceEnd = this.rParenPos; //the position has been stored explicitly
+       int argumentLength;
+       if ((argumentLength = this.expressionLengthStack[this.expressionLengthPtr--]) != 0) {
+               this.expressionPtr -= argumentLength;
+               System.arraycopy(
+                       this.expressionStack, 
+                       this.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 = this.intStack[this.intPtr--];
+       pushOnExpressionStack(alloc);
+
+       anonymousType.bodyStart = this.scanner.currentPosition; 
+       this.listLength = 0; // will be updated when reading super-interfaces
+       // recovery
+       if (this.currentElement != null){ 
+               this.lastCheckPoint = anonymousType.bodyStart;          
+               this.currentElement = this.currentElement.add(anonymousType, 0);
+               this.currentToken = 0; // opening brace already taken into account
+               this.lastIgnoredToken = -1;
+       }       
+}
+protected void consumeEnterCompilationUnit() {
+       // EnterCompilationUnit ::= $empty
+       // do nothing by default
+}
+protected void consumeEnterVariable() {
+       // EnterVariable ::= $empty
+       // do nothing by default
+
+       char[] identifierName = this.identifierStack[this.identifierPtr];
+       long namePosition = this.identifierPositionStack[this.identifierPtr];
+       int extendedDimension = this.intStack[this.intPtr--];
+       AbstractVariableDeclaration declaration;
+       // create the ast node
+       boolean isLocalDeclaration = this.nestedMethod[this.nestedType] != 0; 
+       if (isLocalDeclaration) {
+               // create the local variable declarations
+               declaration = 
+                       this.createLocalDeclaration(identifierName, (int) (namePosition >>> 32), (int) namePosition);
+       } else {
+               // create the field declaration
+               declaration = 
+                       this.createFieldDeclaration(identifierName, (int) (namePosition >>> 32), (int) namePosition); 
+       }
+       
+       this.identifierPtr--;
+       this.identifierLengthPtr--;
+       TypeReference type;
+       int variableIndex = this.variablesCounter[this.nestedType];
+       int typeDim = 0;
+       if (variableIndex == 0) {
+               // first variable of the declaration (FieldDeclaration or LocalDeclaration)
+               if (isLocalDeclaration) {
+                       declaration.declarationSourceStart = this.intStack[this.intPtr--];
+                       declaration.modifiers = this.intStack[this.intPtr--];
+                       type = getTypeReference(typeDim = this.intStack[this.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 = this.intStack[this.intPtr--]); // type dimension
+                       pushOnAstStack(type);
+                       declaration.declarationSourceStart = this.intStack[this.intPtr--];
+                       declaration.modifiers = this.intStack[this.intPtr--];
+                       
+                       // Store javadoc only on first declaration as it is the same for all ones
+                       FieldDeclaration fieldDeclaration = (FieldDeclaration) declaration;
+                       fieldDeclaration.javadoc = this.javadoc;
+                       this.javadoc = null;
+               }
+       } else {
+               type = (TypeReference) this.astStack[this.astPtr - variableIndex];
+               typeDim = type.dimensions();
+               AbstractVariableDeclaration previousVariable = 
+                       (AbstractVariableDeclaration) this.astStack[this.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 = this.identifierLengthStack[this.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);
+               }
+       }
+       this.variablesCounter[this.nestedType]++;
+       pushOnAstStack(declaration);
+       // recovery
+       if (this.currentElement != null) {
+               if (!(this.currentElement instanceof RecoveredType)
+                       && (this.currentToken == TokenNameDOT
+                               //|| declaration.modifiers != 0
+                               || (this.scanner.getLineNumber(declaration.type.sourceStart)
+                                               != this.scanner.getLineNumber((int) (namePosition >>> 32))))){
+                       this.lastCheckPoint = (int) (namePosition >>> 32);
+                       this.restartRecovery = true;
+                       return;
+               }
+               if (isLocalDeclaration){
+                       LocalDeclaration localDecl = (LocalDeclaration) this.astStack[this.astPtr];
+                       this.lastCheckPoint = localDecl.sourceEnd + 1;
+                       this.currentElement = this.currentElement.add(localDecl, 0);
+               } else {
+                       FieldDeclaration fieldDecl = (FieldDeclaration) this.astStack[this.astPtr];
+                       this.lastCheckPoint = fieldDecl.sourceEnd + 1;
+                       this.currentElement = this.currentElement.add(fieldDecl, 0);
+               }
+               this.lastIgnoredToken = -1;
+       }
+}
+protected void consumeEqualityExpression(int op) {
+       // EqualityExpression ::= EqualityExpression '==' RelationalExpression
+       // EqualityExpression ::= EqualityExpression '!=' RelationalExpression
+
+       //optimize the push/pop
+
+       this.expressionPtr--;
+       this.expressionLengthPtr--;
+       this.expressionStack[this.expressionPtr] =
+               new EqualExpression(
+                       this.expressionStack[this.expressionPtr],
+                       this.expressionStack[this.expressionPtr + 1],
+                       op);
+}
+protected void consumeExitTryBlock() {
+       //ExitTryBlock ::= $empty
+       if(this.currentElement != null) {
+               this.restartRecovery = true;
+       }
+}
+protected void consumeExitVariableWithInitialization() {
+       // ExitVariableWithInitialization ::= $empty
+       // do nothing by default
+       this.expressionLengthPtr--;
+       AbstractVariableDeclaration variableDecl = (AbstractVariableDeclaration) this.astStack[this.astPtr];
+       variableDecl.initialization = this.expressionStack[this.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;
+       
+       this.recoveryExitFromVariable();
+}
+protected void consumeExitVariableWithoutInitialization() {
+       // ExitVariableWithoutInitialization ::= $empty
+       // do nothing by default
+       
+       AbstractVariableDeclaration variableDecl = (AbstractVariableDeclaration) this.astStack[this.astPtr];
+       variableDecl.declarationSourceEnd = variableDecl.declarationEnd;
+       
+       this.recoveryExitFromVariable();
+}
+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 = this.intStack[this.intPtr--];
+       ExplicitConstructorCall ecc = new ExplicitConstructorCall(recFlag);
+       int length;
+       if ((length = this.expressionLengthStack[this.expressionLengthPtr--]) != 0) {
+               this.expressionPtr -= length;
+               System.arraycopy(this.expressionStack, this.expressionPtr + 1, ecc.arguments = new Expression[length], 0, length);
+       }
+       switch (flag) {
+               case 0 :
+                       ecc.sourceStart = startPosition;
+                       break;
+               case 1 :
+                       this.expressionLengthPtr--;
+                       ecc.sourceStart = (ecc.qualification = this.expressionStack[this.expressionPtr--]).sourceStart;
+                       break;
+               case 2 :
+                       ecc.sourceStart = (ecc.qualification = getUnspecifiedReferenceOptimized()).sourceStart;
+                       break;
+       }
+       pushOnAstStack(ecc);
+       ecc.sourceEnd = this.endPosition;
+}
+protected void consumeExpressionStatement() {
+       // ExpressionStatement ::= StatementExpression ';'
+       this.expressionLengthPtr--;
+       pushOnAstStack(this.expressionStack[this.expressionPtr--]);
+}
+protected void consumeFieldAccess(boolean isSuperAccess) {
+       // FieldAccess ::= Primary '.' 'Identifier'
+       // FieldAccess ::= 'super' '.' 'Identifier'
+
+       FieldReference fr =
+               new FieldReference(
+                       this.identifierStack[this.identifierPtr],
+                       this.identifierPositionStack[this.identifierPtr--]);
+       this.identifierLengthPtr--;
+       if (isSuperAccess) {
+               //considerates the fieldReference beginning at the 'super' .... 
+               fr.sourceStart = this.intStack[this.intPtr--];
+               fr.receiver = new SuperReference(fr.sourceStart, this.endPosition);
+               pushOnExpressionStack(fr);
+       } else {
+               //optimize push/pop
+               if ((fr.receiver = this.expressionStack[this.expressionPtr]).isThis()) {
+                       //fieldreference begins at the this
+                       fr.sourceStart = fr.receiver.sourceStart;
+               }
+               this.expressionStack[this.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 = this.astLengthStack[this.astLengthPtr];
+
+       for (int i = variableDeclaratorsCounter - 1; i >= 0; i--) {
+               FieldDeclaration fieldDeclaration = (FieldDeclaration) this.astStack[this.astPtr - i];
+               fieldDeclaration.declarationSourceEnd = this.endStatementPosition; 
+               fieldDeclaration.declarationEnd = this.endStatementPosition;    // semi-colon included
+       }
+       
+       updateSourceDeclarationParts(variableDeclaratorsCounter);
+       int endPos = flushCommentsDefinedPriorTo(this.endStatementPosition);
+       if (endPos != this.endStatementPosition) {
+               for (int i = 0; i < variableDeclaratorsCounter; i++) {
+                       FieldDeclaration fieldDeclaration = (FieldDeclaration) this.astStack[this.astPtr - i];
+                       fieldDeclaration.declarationSourceEnd = endPos;
+               }
+       }
+       // update the astStack, astPtr and astLengthStack
+       int startIndex = this.astPtr - this.variablesCounter[this.nestedType] + 1;
+       System.arraycopy(
+               this.astStack, 
+               startIndex, 
+               this.astStack, 
+               startIndex - 1, 
+               variableDeclaratorsCounter); 
+       this.astPtr--; // remove the type reference
+       this.astLengthStack[--this.astLengthPtr] = variableDeclaratorsCounter;
+
+       // recovery
+       if (this.currentElement != null) {
+               this.lastCheckPoint = endPos + 1;
+               if (this.currentElement.parent != null && this.currentElement instanceof RecoveredField){
+                       if (!(this.currentElement instanceof RecoveredInitializer)) {
+                               this.currentElement = this.currentElement.parent;
+                       }
+               }
+               this.restartRecovery = true;
+       }
+       this.variablesCounter[this.nestedType] = 0;
+}
+protected void consumeForceNoDiet() {
+       // ForceNoDiet ::= $empty
+       this.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 :  
+       */
+
+       this.identifierLengthPtr--;
+       char[] identifierName = this.identifierStack[this.identifierPtr];
+       long namePositions = this.identifierPositionStack[this.identifierPtr--];
+       TypeReference type = getTypeReference(this.intStack[this.intPtr--] + this.intStack[this.intPtr--]);
+       int modifierPositions = this.intStack[this.intPtr--];
+       this.intPtr--;
+       Argument arg = 
+               new Argument(
+                       identifierName, 
+                       namePositions, 
+                       type, 
+                       this.intStack[this.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 */
+       this.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 = this.astLengthStack[this.astLengthPtr--]) != 0) {
+               this.astPtr -= length;
+               System.arraycopy(
+                       this.astStack,
+                       this.astPtr + 1,
+                       this.compilationUnit.imports = new ImportReference[length],
+                       0,
+                       length);
+       }
+}
+protected void consumeInsideCastExpression() {
+       // InsideCastExpression ::= $empty
+}
+protected void consumeInsideCastExpressionLL1() {
+       // InsideCastExpressionLL1 ::= $empty
+}
+
+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;
+       this.expressionStack[this.expressionPtr] = exp =
+               new InstanceOfExpression(
+                       this.expressionStack[this.expressionPtr],
+                       getTypeReference(this.intStack[this.intPtr--]),
+                       op);
+       if (exp.sourceEnd == 0) {
+               //array on base type....
+               exp.sourceEnd = this.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 = this.astLengthStack[this.astLengthPtr--]) != 0) {
+               //there are length declarations
+               //dispatch.....according to the type of the declarations
+               dispatchDeclarationInto(length);
+       }
+
+       TypeDeclaration typeDecl = (TypeDeclaration) this.astStack[this.astPtr];
+       
+       // mark initializers with local type mark if needed
+       markInitializersWithLocalType(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 = this.endStatementPosition;
+       if (length == 0 && !containsComment(typeDecl.bodyStart, typeDecl.bodyEnd)) {
+               typeDecl.bits |= ASTNode.UndocumentedEmptyBlockMASK;
+       }
+       typeDecl.declarationSourceEnd = flushCommentsDefinedPriorTo(this.endStatementPosition); 
+}
+protected void consumeInterfaceHeader() {
+       // InterfaceHeader ::= InterfaceHeaderName InterfaceHeaderExtendsopt
+
+       TypeDeclaration typeDecl = (TypeDeclaration) this.astStack[this.astPtr];        
+       if (this.currentToken == TokenNameLBRACE){ 
+               typeDecl.bodyStart = this.scanner.currentPosition;
+       }
+       if (this.currentElement != null){
+               this.restartRecovery = true; // used to avoid branching back into the regular automaton         
+       }
+       // flush the comments related to the interface header
+       this.scanner.commentPtr = -1;   
+}
+protected void consumeInterfaceHeaderExtends() {
+       // InterfaceHeaderExtends ::= 'extends' InterfaceTypeList
+       int length = this.astLengthStack[this.astLengthPtr--];
+       //super interfaces
+       this.astPtr -= length;
+       TypeDeclaration typeDecl = (TypeDeclaration) this.astStack[this.astPtr];
+       System.arraycopy(
+               this.astStack, 
+               this.astPtr + 1, 
+               typeDecl.superInterfaces = new TypeReference[length], 
+               0, 
+               length); 
+       typeDecl.bodyStart = typeDecl.superInterfaces[length-1].sourceEnd + 1;          
+       this.listLength = 0; // reset after having read super-interfaces                
+       // recovery
+       if (this.currentElement != null) { 
+               this.lastCheckPoint = typeDecl.bodyStart;
+       }
+}
+protected void consumeInterfaceHeaderName() {
+       // InterfaceHeaderName ::= Modifiersopt 'interface' 'Identifier'
+       TypeDeclaration typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult);
+
+       if (this.nestedMethod[this.nestedType] == 0) {
+               if (this.nestedType != 0) {
+                       typeDecl.bits |= ASTNode.IsMemberTypeMASK;
+               }
+       } else {
+               // Record that the block has a declaration for local types
+               typeDecl.bits |= ASTNode.IsLocalTypeMASK;
+               markEnclosingMemberWithLocalType();
+               blockReal();
+       }
+
+       //highlight the name of the type
+       long pos = this.identifierPositionStack[this.identifierPtr];
+       typeDecl.sourceEnd = (int) pos;
+       typeDecl.sourceStart = (int) (pos >>> 32);
+       typeDecl.name = this.identifierStack[this.identifierPtr--];
+       this.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 = this.intStack[this.intPtr--];
+       this.intPtr--; // remove the end position of the class token
+       typeDecl.modifiersSourceStart = this.intStack[this.intPtr--];
+       typeDecl.modifiers = this.intStack[this.intPtr--];
+       if (typeDecl.modifiersSourceStart >= 0) {
+               typeDecl.declarationSourceStart = typeDecl.modifiersSourceStart;
+       }
+       typeDecl.bodyStart = typeDecl.sourceEnd + 1;
+       pushOnAstStack(typeDecl);
+       this.listLength = 0; // will be updated when reading super-interfaces
+       // recovery
+       if (this.currentElement != null){ // is recovering
+               this.lastCheckPoint = typeDecl.bodyStart;
+               this.currentElement = this.currentElement.add(typeDecl, 0);
+               this.lastIgnoredToken = -1;             
+       }
+       // javadoc
+       typeDecl.javadoc = this.javadoc;
+       this.javadoc = null;
+}
+protected void consumeInterfaceMemberDeclarations() {
+       // InterfaceMemberDeclarations ::= InterfaceMemberDeclarations InterfaceMemberDeclaration
+       concatNodeLists();
+}
+protected void consumeInterfaceMemberDeclarationsopt() {
+       // InterfaceMemberDeclarationsopt ::= NestedType InterfaceMemberDeclarations
+       this.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 */
+       this.listLength++;      
+}
+protected void consumeInterfaceTypeList() {
+       // InterfaceTypeList ::= InterfaceTypeList ',' InterfaceType
+       optimizedConcatNodeLists();
+}
+protected void consumeLeftParen() {
+       // PushLPAREN ::= '('
+       pushOnIntStack(this.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 = this.astLengthStack[this.astLengthPtr];
+
+       // update the astStack, astPtr and astLengthStack
+       int startIndex = this.astPtr - this.variablesCounter[this.nestedType] + 1;
+       System.arraycopy(
+               this.astStack, 
+               startIndex, 
+               this.astStack, 
+               startIndex - 1, 
+               variableDeclaratorsCounter); 
+       this.astPtr--; // remove the type reference
+       this.astLengthStack[--this.astLengthPtr] = variableDeclaratorsCounter;
+       this.variablesCounter[this.nestedType] = 0;
+}
+protected void consumeLocalVariableDeclarationStatement() {
+       // LocalVariableDeclarationStatement ::= LocalVariableDeclaration ';'
+       // see blockReal in case of change: duplicated code
+       // increment the amount of declared variables for this block
+       this.realBlockStack[this.realBlockPtr]++;
+       
+       // update source end to include the semi-colon
+       int variableDeclaratorsCounter = this.astLengthStack[this.astLengthPtr];
+       for (int i = variableDeclaratorsCounter - 1; i >= 0; i--) {
+               LocalDeclaration localDeclaration = (LocalDeclaration) this.astStack[this.astPtr - i];
+               localDeclaration.declarationSourceEnd = this.endStatementPosition; 
+               localDeclaration.declarationEnd = this.endStatementPosition;    // semi-colon included
+       }
+
+}
+protected void consumeMethodBody() {
+       // MethodBody ::= NestedMethod '{' BlockStatementsopt '}' 
+       this.nestedMethod[this.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
+               this.intPtr--;
+               this.intPtr--;
+       }
+
+       int explicitDeclarations = 0;
+       Statement[] statements = null;
+       if (isNotAbstract) {
+               //statements
+               explicitDeclarations = this.realBlockStack[this.realBlockPtr--];
+               if ((length = this.astLengthStack[this.astLengthPtr--]) != 0) {
+                       System.arraycopy(
+                               this.astStack, 
+                               (this.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) this.astStack[this.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;
+       } else {
+               if (!this.diet && statements == null) {
+                       if (!containsComment(md.bodyStart, this.endPosition)) {
+                               md.bits |= ASTNode.UndocumentedEmptyBlockMASK;
+                       }
+               }
+       }
+       // store the endPosition (position just before the '}') in case there is
+       // a trailing comment behind the end of the method
+       md.bodyEnd = this.endPosition;
+       md.declarationSourceEnd = flushCommentsDefinedPriorTo(this.endStatementPosition);
+}
+protected void consumeMethodHeader() {
+       // MethodHeader ::= MethodHeaderName MethodHeaderParameters MethodHeaderExtendedDims ThrowsClauseopt
+       // retrieve end position of method declarator
+       AbstractMethodDeclaration method = (AbstractMethodDeclaration)this.astStack[this.astPtr];
+
+       if (this.currentToken == TokenNameLBRACE){ 
+               method.bodyStart = this.scanner.currentPosition;
+       }
+       // recovery
+       if (this.currentElement != null){
+               if (this.currentToken == TokenNameSEMICOLON){
+                       method.modifiers |= AccSemicolonBody;                   
+                       method.declarationSourceEnd = this.scanner.currentPosition-1;
+                       method.bodyEnd = this.scanner.currentPosition-1;
+                       if (this.currentElement.parseTree() == method && this.currentElement.parent != null) {
+                               this.currentElement = this.currentElement.parent;
+                       }
+               }               
+               this.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) this.astStack[this.astPtr];
+       int extendedDims = this.intStack[this.intPtr--];
+       if (extendedDims != 0) {
+               TypeReference returnType = md.returnType;
+               md.sourceEnd = this.endPosition;
+               int dims = returnType.dimensions() + extendedDims;
+               int baseType;
+               if ((baseType = this.identifierLengthStack[this.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 (this.currentToken == TokenNameLBRACE){ 
+                       md.bodyStart = this.endPosition + 1;
+               }
+               // recovery
+               if (this.currentElement != null){
+                       this.lastCheckPoint = md.bodyStart;
+               }               
+       }
+}
+protected void consumeMethodHeaderName() {
+       // MethodHeaderName ::= Modifiersopt Type 'Identifier' '('
+       MethodDeclaration md = new MethodDeclaration(this.compilationUnit.compilationResult);
+
+       //name
+       md.selector = this.identifierStack[this.identifierPtr];
+       long selectorSource = this.identifierPositionStack[this.identifierPtr--];
+       this.identifierLengthPtr--;
+       //type
+       md.returnType = getTypeReference(this.intStack[this.intPtr--]);
+       //modifiers
+       md.declarationSourceStart = this.intStack[this.intPtr--];
+       md.modifiers = this.intStack[this.intPtr--];
+       // javadoc
+       md.javadoc = this.javadoc;
+       this.javadoc = null;
+
+       //highlight starts at selector start
+       md.sourceStart = (int) (selectorSource >>> 32);
+       pushOnAstStack(md);
+       md.sourceEnd = this.lParenPos;
+       md.bodyStart = this.lParenPos+1;
+       this.listLength = 0; // initialize listLength before reading parameters/throws
+       
+       // recovery
+       if (this.currentElement != null){
+               if (this.currentElement instanceof RecoveredType 
+                       //|| md.modifiers != 0
+                       || (this.scanner.getLineNumber(md.returnType.sourceStart)
+                                       == this.scanner.getLineNumber(md.sourceStart))){
+                       this.lastCheckPoint = md.bodyStart;
+                       this.currentElement = this.currentElement.add(md, 0);
+                       this.lastIgnoredToken = -1;
+               } else {
+                       this.lastCheckPoint = md.sourceStart;
+                       this.restartRecovery = true;
+               }
+       }               
+}
+protected void consumeMethodHeaderParameters() {
+       // MethodHeaderParameters ::= FormalParameterListopt ')'
+       int length = this.astLengthStack[this.astLengthPtr--];
+       this.astPtr -= length;
+       AbstractMethodDeclaration md = (AbstractMethodDeclaration) this.astStack[this.astPtr];
+       md.sourceEnd =  this.rParenPos;
+       //arguments
+       if (length != 0) {
+               System.arraycopy(
+                       this.astStack, 
+                       this.astPtr + 1, 
+                       md.arguments = new Argument[length], 
+                       0, 
+                       length); 
+       }
+       md.bodyStart = this.rParenPos+1;
+       this.listLength = 0; // reset listLength after having read all parameters
+       // recovery
+       if (this.currentElement != null){
+               this.lastCheckPoint = md.bodyStart;
+               if (this.currentElement.parseTree() == md) return;
+
+               // might not have been attached yet - in some constructor scenarii
+               if (md.isConstructor()){
+                       if ((length != 0)
+                               || (this.currentToken == TokenNameLBRACE) 
+                               || (this.currentToken == TokenNamethrows)){
+                               this.currentElement = this.currentElement.add(md, 0);
+                               this.lastIgnoredToken = -1;
+                       }       
+               }       
+       }       
+}
+protected void consumeMethodHeaderThrowsClause() {
+       // MethodHeaderThrowsClause ::= 'throws' ClassTypeList
+       int length = this.astLengthStack[this.astLengthPtr--];
+       this.astPtr -= length;
+       AbstractMethodDeclaration md = (AbstractMethodDeclaration) this.astStack[this.astPtr];
+       System.arraycopy(
+               this.astStack, 
+               this.astPtr + 1, 
+               md.thrownExceptions = new TypeReference[length], 
+               0, 
+               length);
+       md.sourceEnd = md.thrownExceptions[length-1].sourceEnd;
+       md.bodyStart = md.thrownExceptions[length-1].sourceEnd + 1;
+       this.listLength = 0; // reset listLength after having read all thrown exceptions        
+       // recovery
+       if (this.currentElement != null){
+               this.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 = this.rParenPos;
+       m.sourceStart = 
+               (int) ((m.nameSourcePosition = this.identifierPositionStack[this.identifierPtr]) >>> 32); 
+       m.selector = this.identifierStack[this.identifierPtr--];
+       if (this.identifierLengthStack[this.identifierLengthPtr] == 1) {
+               m.receiver = ThisReference.implicitThis();
+               this.identifierLengthPtr--;
+       } else {
+               this.identifierLengthStack[this.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 = this.identifierPositionStack[this.identifierPtr]) >>> 32); 
+       m.selector = this.identifierStack[this.identifierPtr--];
+       this.identifierLengthPtr--;
+       m.receiver = this.expressionStack[this.expressionPtr];
+       m.sourceStart = m.receiver.sourceStart;
+       m.sourceEnd = this.rParenPos;
+       this.expressionStack[this.expressionPtr] = m;
+}
+protected void consumeMethodInvocationSuper() {
+       // MethodInvocation ::= 'super' '.' 'Identifier' '(' ArgumentListopt ')'
+
+       MessageSend m = newMessageSend();
+       m.sourceStart = this.intStack[this.intPtr--];
+       m.sourceEnd = this.rParenPos;
+       m.nameSourcePosition = this.identifierPositionStack[this.identifierPtr];
+       m.selector = this.identifierStack[this.identifierPtr--];
+       this.identifierLengthPtr--;
+       m.receiver = new SuperReference(m.sourceStart, this.endPosition);
+       pushOnExpressionStack(m);
+}
+protected void consumeModifiers() {
+       int savedModifiersSourceStart = this.modifiersSourceStart;      
+       checkComment(); // might update modifiers with AccDeprecated
+       pushOnIntStack(this.modifiers); // modifiers
+       if (this.modifiersSourceStart >= savedModifiersSourceStart) {
+               this.modifiersSourceStart = savedModifiersSourceStart;
+       }
+       pushOnIntStack(this.modifiersSourceStart);
+       resetModifiers();
+}
+protected void consumeNestedMethod() {
+       // NestedMethod ::= $empty
+       jumpOverMethodBody();
+       this.nestedMethod[this.nestedType] ++;
+       pushOnIntStack(this.scanner.currentPosition);
+       consumeOpenBlock();
+}
+protected void consumeNestedType() {
+       // NestedType ::= $empty
+       int length = this.nestedMethod.length;
+       if (++this.nestedType >= length) {
+               System.arraycopy(
+                       this.nestedMethod, 0,
+                       this.nestedMethod = new int[length + 30], 0,
+                       length);
+               // increase the size of the variablesCounter as well. It has to be consistent with the size of the nestedMethod collection
+               System.arraycopy(
+                       this.variablesCounter, 0,
+                       this.variablesCounter = new int[length + 30], 0,
+                       length);
+       }
+       this.nestedMethod[this.nestedType] = 0;
+       this.variablesCounter[this.nestedType] = 0;
+}
+protected void consumeOneDimLoop() {
+       // OneDimLoop ::= '[' ']'
+       this.dimensions++;
+}
+protected void consumeOnlySynchronized() {
+       // OnlySynchronized ::= 'synchronized'
+       pushOnIntStack(this.synchronizedBlockSourceStart);
+       resetModifiers();
+}
+protected void consumeOpenBlock() {
+       // OpenBlock ::= $empty
+
+       pushOnIntStack(this.scanner.startPosition);
+       int stackLength = this.realBlockStack.length;
+       if (++this.realBlockPtr >= stackLength) {
+               System.arraycopy(
+                       this.realBlockStack, 0,
+                       this.realBlockStack = new int[stackLength + StackIncrement], 0,
+                       stackLength);
+       }
+       this.realBlockStack[this.realBlockPtr] = 0;
+}
+protected void consumePackageDeclaration() {
+       // PackageDeclaration ::= 'package' Name ';'
+       /* build an ImportRef build from the last name 
+       stored in the identifier stack. */
+
+       ImportReference impt = this.compilationUnit.currentPackage;
+       // flush comments defined prior to import statements
+       impt.declarationEnd = this.endStatementPosition;
+       impt.declarationSourceEnd = this.flushCommentsDefinedPriorTo(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 = this.identifierLengthStack[this.identifierLengthPtr--]][]; 
+       this.identifierPtr -= length;
+       long[] positions = new long[length];
+       System.arraycopy(this.identifierStack, ++this.identifierPtr, tokens, 0, length);
+       System.arraycopy(
+               this.identifierPositionStack, 
+               this.identifierPtr--, 
+               positions, 
+               0, 
+               length); 
+       this.compilationUnit.currentPackage = 
+               impt = new ImportReference(tokens, positions, true, AccDefault); 
+
+       if (this.currentToken == TokenNameSEMICOLON){
+               impt.declarationSourceEnd = this.scanner.currentPosition - 1;
+       } else {
+               impt.declarationSourceEnd = impt.sourceEnd;
+       }
+       impt.declarationEnd = impt.declarationSourceEnd;
+       //endPosition is just before the ;
+       impt.declarationSourceStart = this.intStack[this.intPtr--];
+
+       // recovery
+       if (this.currentElement != null){
+               this.lastCheckPoint = impt.declarationSourceEnd+1;
+               this.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 
+       final Expression parenthesizedExpression = this.expressionStack[this.expressionPtr];
+       updateSourcePosition(parenthesizedExpression);
+       int numberOfParenthesis = (parenthesizedExpression.bits & ASTNode.ParenthesizedMASK) >> ASTNode.ParenthesizedSHIFT;
+       parenthesizedExpression.bits &= ~ASTNode.ParenthesizedMASK;
+       parenthesizedExpression.bits |= (numberOfParenthesis + 1) << ASTNode.ParenthesizedSHIFT;
+}
+protected void consumePrimaryNoNewArrayArrayType() {
+       // PrimaryNoNewArray ::= ArrayType '.' 'class'
+       this.intPtr--;
+       pushOnExpressionStack(
+               new ClassLiteralAccess(this.intStack[this.intPtr--],
+               getTypeReference(this.intStack[this.intPtr--])));
+}
+protected void consumePrimaryNoNewArrayName() {
+       // PrimaryNoNewArray ::= Name '.' 'class'
+       this.intPtr--;
+       pushOnExpressionStack(
+               new ClassLiteralAccess(this.intStack[this.intPtr--],
+               getTypeReference(0)));
+}
+protected void consumePrimaryNoNewArrayNameSuper() {
+       // PrimaryNoNewArray ::= Name '.' 'super'
+       pushOnExpressionStack(
+               new QualifiedSuperReference(
+                       getTypeReference(0),
+                       this.intStack[this.intPtr--],
+                       this.endPosition));
+}
+protected void consumePrimaryNoNewArrayNameThis() {
+       // PrimaryNoNewArray ::= Name '.' 'this'
+       pushOnExpressionStack(
+               new QualifiedThisReference(
+                       getTypeReference(0),
+                       this.intStack[this.intPtr--],
+                       this.endPosition));
+}
+protected void consumePrimaryNoNewArrayPrimitiveType() {
+       // PrimaryNoNewArray ::= PrimitiveType '.' 'class'
+       this.intPtr--;
+       pushOnExpressionStack(
+               new ClassLiteralAccess(this.intStack[this.intPtr--],
+               getTypeReference(0)));
+}
+protected void consumePrimaryNoNewArrayThis() {
+       // PrimaryNoNewArray ::= 'this'
+       pushOnExpressionStack(new ThisReference(this.intStack[this.intPtr--], this.endPosition));
+}
+protected void consumePrimitiveType() {
+       // Type ::= PrimitiveType
+       pushOnIntStack(0);
+}
+protected void consumePushModifiers() {
+       pushOnIntStack(this.modifiers); // modifiers
+       pushOnIntStack(this.modifiersSourceStart);
+       resetModifiers();
+}
+protected void consumePushPosition() {
+       // for source managment purpose
+       // PushPosition ::= $empty
+       pushOnIntStack(this.endPosition);
+}
+protected void consumeQualifiedName() {
+       // QualifiedName ::= Name '.' SimpleName 
+       /*back from the recursive loop of QualifiedName.
+       Updates identifier length into the length stack*/
+
+       this.identifierLengthStack[--this.identifierLengthPtr]++;
+}
+protected void consumeReferenceType() {
+       // ReferenceType ::= ClassOrInterfaceType
+       pushOnIntStack(0);
+}
+protected void consumeRestoreDiet() {
+       // RestoreDiet ::= $empty
+       this.dietInt--;
+}
+protected void consumeRightParen() {
+       // PushRPAREN ::= ')'
+       pushOnIntStack(this.rParenPos);
+}
+// This method is part of an automatic generation : do NOT edit-modify  
+protected void consumeRule(int act) {
+       switch ( act ) {
+       case 26 : // System.out.println("Type ::= PrimitiveType");  //$NON-NLS-1$
+               consumePrimitiveType();  
+               break ;
+               
+       case 40 : // System.out.println("ReferenceType ::= ClassOrInterfaceType");  //$NON-NLS-1$
+               consumeReferenceType();   
+               break ;
+               
+       case 49 : // System.out.println("QualifiedName ::= Name DOT SimpleName");  //$NON-NLS-1$
+               consumeQualifiedName();  
+               break ;
+               
+       case 50 : // System.out.println("CompilationUnit ::= EnterCompilationUnit PackageDeclarationopt...");  //$NON-NLS-1$
+               consumeCompilationUnit();  
+               break ;
+               
+       case 51 : // System.out.println("EnterCompilationUnit ::=");  //$NON-NLS-1$
+               consumeEnterCompilationUnit();  
+               break ;
+               
+       case 64 : // System.out.println("CatchHeader ::= catch LPAREN FormalParameter RPAREN LBRACE");  //$NON-NLS-1$
+               consumeCatchHeader();  
+               break ;
+               
+       case 66 : // System.out.println("ImportDeclarations ::= ImportDeclarations ImportDeclaration");  //$NON-NLS-1$
+               consumeImportDeclarations();  
+               break ;
+               
+       case 68 : // System.out.println("TypeDeclarations ::= TypeDeclarations TypeDeclaration");  //$NON-NLS-1$
+               consumeTypeDeclarations();  
+               break ;
+               
+       case 69 : // System.out.println("PackageDeclaration ::= PackageDeclarationName SEMICOLON");  //$NON-NLS-1$
+               consumePackageDeclaration();  
+               break ;
+               
+       case 70 : // System.out.println("PackageDeclarationName ::= package Name");  //$NON-NLS-1$
+               consumePackageDeclarationName();  
+               break ;
+               
+       case 73 : // System.out.println("SingleTypeImportDeclaration ::= SingleTypeImportDeclarationName...");  //$NON-NLS-1$
+               consumeSingleTypeImportDeclaration();  
+               break ;
+               
+       case 74 : // System.out.println("SingleTypeImportDeclarationName ::= import Name");  //$NON-NLS-1$
+               consumeSingleTypeImportDeclarationName();  
+               break ;
+               
+       case 75 : // System.out.println("TypeImportOnDemandDeclaration ::= TypeImportOnDemandDeclarationName");  //$NON-NLS-1$
+               consumeTypeImportOnDemandDeclaration();  
+               break ;
+               
+       case 76 : // System.out.println("TypeImportOnDemandDeclarationName ::= import Name DOT MULTIPLY");  //$NON-NLS-1$
+               consumeTypeImportOnDemandDeclarationName();  
+               break ;
+               
+       case 79 : // System.out.println("TypeDeclaration ::= SEMICOLON");  //$NON-NLS-1$
+               consumeEmptyTypeDeclaration();  
+               break ;
+               
+       case 93 : // System.out.println("ClassDeclaration ::= ClassHeader ClassBody");  //$NON-NLS-1$
+               consumeClassDeclaration();  
+               break ;
+               
+       case 94 : // System.out.println("ClassHeader ::= ClassHeaderName ClassHeaderExtendsopt...");  //$NON-NLS-1$
+               consumeClassHeader();  
+               break ;
+               
+       case 95 : // System.out.println("ClassHeaderName ::= Modifiersopt class Identifier");  //$NON-NLS-1$
+               consumeClassHeaderName();  
+               break ;
+               
+       case 96 : // System.out.println("ClassHeaderExtends ::= extends ClassType");  //$NON-NLS-1$
+               consumeClassHeaderExtends();  
+               break ;
+               
+       case 97 : // System.out.println("ClassHeaderImplements ::= implements InterfaceTypeList");  //$NON-NLS-1$
+               consumeClassHeaderImplements();  
+               break ;
+               
+       case 99 : // System.out.println("InterfaceTypeList ::= InterfaceTypeList COMMA InterfaceType");  //$NON-NLS-1$
+               consumeInterfaceTypeList();  
+               break ;
+               
+       case 100 : // System.out.println("InterfaceType ::= ClassOrInterfaceType");  //$NON-NLS-1$
+               consumeInterfaceType();  
+               break ;
+               
+       case 103 : // System.out.println("ClassBodyDeclarations ::= ClassBodyDeclarations ClassBodyDeclaration");  //$NON-NLS-1$
+               consumeClassBodyDeclarations();  
+               break ;
+               
+       case 107 : // System.out.println("ClassBodyDeclaration ::= Diet NestedMethod Block");  //$NON-NLS-1$
+               consumeClassBodyDeclaration();  
+               break ;
+               
+       case 108 : // System.out.println("Diet ::=");  //$NON-NLS-1$
+               consumeDiet();  
+               break ;
+
+       case 109 : // System.out.println("Initializer ::= Diet NestedMethod Block");  //$NON-NLS-1$
+               consumeClassBodyDeclaration();  
+               break ;
+               
+       case 116 : // System.out.println("ClassMemberDeclaration ::= SEMICOLON");  //$NON-NLS-1$
+               consumeEmptyClassMemberDeclaration();  
+               break ;
+
+       case 117 : // System.out.println("FieldDeclaration ::= Modifiersopt Type VariableDeclarators SEMICOLON");  //$NON-NLS-1$
+               consumeFieldDeclaration();  
+               break ;
+               
+       case 119 : // System.out.println("VariableDeclarators ::= VariableDeclarators COMMA VariableDeclarator");  //$NON-NLS-1$
+               consumeVariableDeclarators();  
+               break ;
+               
+       case 122 : // System.out.println("EnterVariable ::=");  //$NON-NLS-1$
+               consumeEnterVariable();  
+               break ;
+               
+       case 123 : // System.out.println("ExitVariableWithInitialization ::=");  //$NON-NLS-1$
+               consumeExitVariableWithInitialization();  
+               break ;
+               
+       case 124 : // System.out.println("ExitVariableWithoutInitialization ::=");  //$NON-NLS-1$
+               consumeExitVariableWithoutInitialization();  
+               break ;
+               
+       case 125 : // System.out.println("ForceNoDiet ::=");  //$NON-NLS-1$
+               consumeForceNoDiet();  
+               break ;
+               
+       case 126 : // System.out.println("RestoreDiet ::=");  //$NON-NLS-1$
+               consumeRestoreDiet();  
+               break ;
+               
+       case 131 : // System.out.println("MethodDeclaration ::= MethodHeader MethodBody");  //$NON-NLS-1$
+               // set to true to consume a method with a body
+               consumeMethodDeclaration(true);   
+               break ;
+               
+       case 132 : // System.out.println("AbstractMethodDeclaration ::= MethodHeader SEMICOLON");  //$NON-NLS-1$
+               // set to false to consume a method without body
+               consumeMethodDeclaration(false);  
+               break ;
+               
+       case 133 : // System.out.println("MethodHeader ::= MethodHeaderName MethodHeaderParameters...");  //$NON-NLS-1$
+               consumeMethodHeader();  
+               break ;
+               
+       case 134 : // System.out.println("MethodHeaderName ::= Modifiersopt Type Identifier LPAREN");  //$NON-NLS-1$
+               consumeMethodHeaderName();  
+               break ;
+               
+       case 135 : // System.out.println("MethodHeaderParameters ::= FormalParameterListopt RPAREN");  //$NON-NLS-1$
+               consumeMethodHeaderParameters();  
+               break ;
+               
+       case 136 : // System.out.println("MethodHeaderExtendedDims ::= Dimsopt");  //$NON-NLS-1$
+               consumeMethodHeaderExtendedDims();  
+               break ;
+               
+       case 137 : // System.out.println("MethodHeaderThrowsClause ::= throws ClassTypeList");  //$NON-NLS-1$
+               consumeMethodHeaderThrowsClause();  
+               break ;
+               
+       case 138 : // System.out.println("ConstructorHeader ::= ConstructorHeaderName MethodHeaderParameters");  //$NON-NLS-1$
+               consumeConstructorHeader();  
+               break ;
+               
+       case 139 : // System.out.println("ConstructorHeaderName ::= Modifiersopt Identifier LPAREN");  //$NON-NLS-1$
+               consumeConstructorHeaderName();  
+               break ;
+               
+       case 141 : // System.out.println("FormalParameterList ::= FormalParameterList COMMA FormalParameter");  //$NON-NLS-1$
+               consumeFormalParameterList();  
+               break ;
+               
+       case 142 : // System.out.println("FormalParameter ::= Modifiersopt Type VariableDeclaratorId");  //$NON-NLS-1$
+               // the boolean is used to know if the modifiers should be reset
+               consumeFormalParameter();  
+               break ;
+               
+       case 144 : // System.out.println("ClassTypeList ::= ClassTypeList COMMA ClassTypeElt");  //$NON-NLS-1$
+               consumeClassTypeList();  
+               break ;
+               
+       case 145 : // System.out.println("ClassTypeElt ::= ClassType");  //$NON-NLS-1$
+               consumeClassTypeElt();  
+               break ;
+               
+       case 146 : // System.out.println("MethodBody ::= NestedMethod LBRACE BlockStatementsopt RBRACE");  //$NON-NLS-1$
+               consumeMethodBody();  
+               break ;
+               
+       case 147 : // System.out.println("NestedMethod ::=");  //$NON-NLS-1$
+               consumeNestedMethod();  
+               break ;
+               
+       case 148 : // System.out.println("StaticInitializer ::= StaticOnly Block");  //$NON-NLS-1$
+               consumeStaticInitializer();  
+               break ;
+
+       case 149 : // System.out.println("StaticOnly ::= static");  //$NON-NLS-1$
+               consumeStaticOnly();  
+               break ;
+               
+       case 150 : // System.out.println("ConstructorDeclaration ::= ConstructorHeader MethodBody");  //$NON-NLS-1$
+               consumeConstructorDeclaration() ;  
+               break ;
+               
+       case 151 : // System.out.println("ConstructorDeclaration ::= ConstructorHeader SEMICOLON");  //$NON-NLS-1$
+               consumeInvalidConstructorDeclaration() ;  
+               break ;
+               
+       case 152 : // System.out.println("ExplicitConstructorInvocation ::= this LPAREN ArgumentListopt RPAREN");  //$NON-NLS-1$
+               consumeExplicitConstructorInvocation(0,ExplicitConstructorCall.This);  
+               break ;
+               
+       case 153 : // System.out.println("ExplicitConstructorInvocation ::= super LPAREN ArgumentListopt...");  //$NON-NLS-1$
+               consumeExplicitConstructorInvocation(0,ExplicitConstructorCall.Super);  
+               break ;
+               
+       case 154 : // System.out.println("ExplicitConstructorInvocation ::= Primary DOT super LPAREN...");  //$NON-NLS-1$
+               consumeExplicitConstructorInvocation(1, ExplicitConstructorCall.Super);  
+               break ;
+               
+       case 155 : // System.out.println("ExplicitConstructorInvocation ::= Name DOT super LPAREN...");  //$NON-NLS-1$
+               consumeExplicitConstructorInvocation(2, ExplicitConstructorCall.Super);  
+               break ;
+               
+       case 156 : // System.out.println("ExplicitConstructorInvocation ::= Primary DOT this LPAREN...");  //$NON-NLS-1$
+               consumeExplicitConstructorInvocation(1, ExplicitConstructorCall.This);  
+               break ;
+               
+       case 157 : // System.out.println("ExplicitConstructorInvocation ::= Name DOT this LPAREN...");  //$NON-NLS-1$
+               consumeExplicitConstructorInvocation(2, ExplicitConstructorCall.This);  
+               break ;
+               
+       case 158 : // System.out.println("InterfaceDeclaration ::= InterfaceHeader InterfaceBody");  //$NON-NLS-1$
+               consumeInterfaceDeclaration();  
+               break ;
+               
+       case 159 : // System.out.println("InterfaceHeader ::= InterfaceHeaderName InterfaceHeaderExtendsopt");  //$NON-NLS-1$
+               consumeInterfaceHeader();  
+               break ;
+               
+       case 160 : // System.out.println("InterfaceHeaderName ::= Modifiersopt interface Identifier");  //$NON-NLS-1$
+               consumeInterfaceHeaderName();  
+               break ;
+               
+       case 162 : // System.out.println("InterfaceHeaderExtends ::= extends InterfaceTypeList");  //$NON-NLS-1$
+               consumeInterfaceHeaderExtends();  
+               break ;
+               
+       case 165 : // System.out.println("InterfaceMemberDeclarations ::= InterfaceMemberDeclarations...");  //$NON-NLS-1$
+               consumeInterfaceMemberDeclarations();  
+               break ;
+               
+       case 166 : // System.out.println("InterfaceMemberDeclaration ::= SEMICOLON");  //$NON-NLS-1$
+               consumeEmptyInterfaceMemberDeclaration();  
+               break ;
+               
+       case 169 : // System.out.println("InterfaceMemberDeclaration ::= InvalidMethodDeclaration");  //$NON-NLS-1$
+               ignoreMethodBody();  
+               break ;
+               
+       case 170 : // System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader MethodBody");  //$NON-NLS-1$
+               ignoreInvalidConstructorDeclaration(true);   
+               break ;
+               
+       case 171 : // System.out.println("InvalidConstructorDeclaration ::= ConstructorHeader SEMICOLON");  //$NON-NLS-1$
+               ignoreInvalidConstructorDeclaration(false);   
+               break ;
+               
+       case 177 : // System.out.println("ArrayInitializer ::= LBRACE ,opt RBRACE");  //$NON-NLS-1$
+               consumeEmptyArrayInitializer();  
+               break ;
+               
+       case 178 : // System.out.println("ArrayInitializer ::= LBRACE VariableInitializers RBRACE");  //$NON-NLS-1$
+               consumeArrayInitializer();  
+               break ;
+               
+       case 179 : // System.out.println("ArrayInitializer ::= LBRACE VariableInitializers COMMA RBRACE");  //$NON-NLS-1$
+               consumeArrayInitializer();  
+               break ;
+               
+       case 181 : // System.out.println("VariableInitializers ::= VariableInitializers COMMA...");  //$NON-NLS-1$
+               consumeVariableInitializers();  
+               break ;
+               
+       case 182 : // System.out.println("Block ::= OpenBlock LBRACE BlockStatementsopt RBRACE");  //$NON-NLS-1$
+               consumeBlock();  
+               break ;
+               
+       case 183 : // System.out.println("OpenBlock ::=");  //$NON-NLS-1$
+               consumeOpenBlock() ;  
+               break ;
+               
+       case 185 : // System.out.println("BlockStatements ::= BlockStatements BlockStatement");  //$NON-NLS-1$
+               consumeBlockStatements() ;  
+               break ;
+               
+       case 189 : // System.out.println("BlockStatement ::= InvalidInterfaceDeclaration");  //$NON-NLS-1$
+               ignoreInterfaceDeclaration();  
+               break ;
+               
+       case 190 : // System.out.println("LocalVariableDeclarationStatement ::= LocalVariableDeclaration...");  //$NON-NLS-1$
+               consumeLocalVariableDeclarationStatement();  
+               break ;
+               
+       case 191 : // System.out.println("LocalVariableDeclaration ::= Type PushModifiers VariableDeclarators");  //$NON-NLS-1$
+               consumeLocalVariableDeclaration();  
+               break ;
+               
+       case 192 : // System.out.println("LocalVariableDeclaration ::= Modifiers Type PushModifiers...");  //$NON-NLS-1$
+               consumeLocalVariableDeclaration();  
+               break ;
+               
+       case 193 : // System.out.println("PushModifiers ::=");  //$NON-NLS-1$
+               consumePushModifiers();  
+               break ;
+               
+       case 217 : // System.out.println("EmptyStatement ::= SEMICOLON");  //$NON-NLS-1$
+               consumeEmptyStatement();  
+               break ;
+               
+       case 218 : // System.out.println("LabeledStatement ::= Identifier COLON Statement");  //$NON-NLS-1$
+               consumeStatementLabel() ;  
+               break ;
+               
+       case 219 : // System.out.println("LabeledStatementNoShortIf ::= Identifier COLON StatementNoShortIf");  //$NON-NLS-1$
+               consumeStatementLabel() ;  
+               break ;
+               
+       case 220 : // System.out.println("ExpressionStatement ::= StatementExpression SEMICOLON");  //$NON-NLS-1$
+               consumeExpressionStatement();  
+               break ;
+               
+       case 229 : // System.out.println("IfThenStatement ::= if LPAREN Expression RPAREN Statement");  //$NON-NLS-1$
+               consumeStatementIfNoElse();  
+               break ;
+               
+       case 230 : // System.out.println("IfThenElseStatement ::= if LPAREN Expression RPAREN...");  //$NON-NLS-1$
+               consumeStatementIfWithElse();  
+               break ;
+               
+       case 231 : // System.out.println("IfThenElseStatementNoShortIf ::= if LPAREN Expression RPAREN...");  //$NON-NLS-1$
+               consumeStatementIfWithElse();  
+               break ;
+               
+       case 232 : // System.out.println("SwitchStatement ::= switch LPAREN Expression RPAREN OpenBlock...");  //$NON-NLS-1$
+               consumeStatementSwitch() ;  
+               break ;
+               
+       case 233 : // System.out.println("SwitchBlock ::= LBRACE RBRACE");  //$NON-NLS-1$
+               consumeEmptySwitchBlock() ;  
+               break ;
+               
+       case 236 : // System.out.println("SwitchBlock ::= LBRACE SwitchBlockStatements SwitchLabels RBRACE");  //$NON-NLS-1$
+               consumeSwitchBlock() ;  
+               break ;
+               
+       case 238 : // System.out.println("SwitchBlockStatements ::= SwitchBlockStatements SwitchBlockStatement");  //$NON-NLS-1$
+               consumeSwitchBlockStatements() ;  
+               break ;
+               
+       case 239 : // System.out.println("SwitchBlockStatement ::= SwitchLabels BlockStatements");  //$NON-NLS-1$
+               consumeSwitchBlockStatement() ;  
+               break ;
+               
+       case 241 : // System.out.println("SwitchLabels ::= SwitchLabels SwitchLabel");  //$NON-NLS-1$
+               consumeSwitchLabels() ;  
+               break ;
+               
+       case 242 : // System.out.println("SwitchLabel ::= case ConstantExpression COLON");  //$NON-NLS-1$
+               consumeCaseLabel();  
+               break ;
+               
+       case 243 : // System.out.println("SwitchLabel ::= default COLON");  //$NON-NLS-1$
+               consumeDefaultLabel();  
+               break ;
+               
+       case 244 : // System.out.println("WhileStatement ::= while LPAREN Expression RPAREN Statement");  //$NON-NLS-1$
+               consumeStatementWhile() ;  
+               break ;
+               
+       case 245 : // System.out.println("WhileStatementNoShortIf ::= while LPAREN Expression RPAREN...");  //$NON-NLS-1$
+               consumeStatementWhile() ;  
+               break ;
+               
+       case 246 : // System.out.println("DoStatement ::= do Statement while LPAREN Expression RPAREN...");  //$NON-NLS-1$
+               consumeStatementDo() ;  
+               break ;
+               
+       case 247 : // System.out.println("ForStatement ::= for LPAREN ForInitopt SEMICOLON Expressionopt...");  //$NON-NLS-1$
+               consumeStatementFor() ;  
+               break ;
+               
+       case 248 : // System.out.println("ForStatementNoShortIf ::= for LPAREN ForInitopt SEMICOLON...");  //$NON-NLS-1$
+               consumeStatementFor() ;  
+               break ;
+               
+       case 249 : // System.out.println("ForInit ::= StatementExpressionList");  //$NON-NLS-1$
+               consumeForInit() ;  
+               break ;
+               
+       case 253 : // System.out.println("StatementExpressionList ::= StatementExpressionList COMMA...");  //$NON-NLS-1$
+               consumeStatementExpressionList() ;  
+               break ;
+               
+       case 254 : // System.out.println("AssertStatement ::= assert Expression SEMICOLON");  //$NON-NLS-1$
+               consumeSimpleAssertStatement() ;  
+               break ;
+               
+       case 255 : // System.out.println("AssertStatement ::= assert Expression COLON Expression SEMICOLON");  //$NON-NLS-1$
+               consumeAssertStatement() ;  
+               break ;
+               
+       case 256 : // System.out.println("BreakStatement ::= break SEMICOLON");  //$NON-NLS-1$
+               consumeStatementBreak() ;  
+               break ;
+               
+       case 257 : // System.out.println("BreakStatement ::= break Identifier SEMICOLON");  //$NON-NLS-1$
+               consumeStatementBreakWithLabel() ;  
+               break ;
+               
+       case 258 : // System.out.println("ContinueStatement ::= continue SEMICOLON");  //$NON-NLS-1$
+               consumeStatementContinue() ;  
+               break ;
+               
+       case 259 : // System.out.println("ContinueStatement ::= continue Identifier SEMICOLON");  //$NON-NLS-1$
+               consumeStatementContinueWithLabel() ;  
+               break ;
+               
+       case 260 : // System.out.println("ReturnStatement ::= return Expressionopt SEMICOLON");  //$NON-NLS-1$
+               consumeStatementReturn() ;  
+               break ;
+               
+       case 261 : // System.out.println("ThrowStatement ::= throw Expression SEMICOLON");  //$NON-NLS-1$
+               consumeStatementThrow();
+               
+               break ;
+               
+       case 262 : // System.out.println("SynchronizedStatement ::= OnlySynchronized LPAREN Expression RPAREN");  //$NON-NLS-1$
+               consumeStatementSynchronized();  
+               break ;
+               
+       case 263 : // System.out.println("OnlySynchronized ::= synchronized");  //$NON-NLS-1$
+               consumeOnlySynchronized();  
+               break ;
+               
+       case 264 : // System.out.println("TryStatement ::= try TryBlock Catches");  //$NON-NLS-1$
+               consumeStatementTry(false);  
+               break ;
+               
+       case 265 : // System.out.println("TryStatement ::= try TryBlock Catchesopt Finally");  //$NON-NLS-1$
+               consumeStatementTry(true);  
+               break ;
+               
+       case 267 : // System.out.println("ExitTryBlock ::=");  //$NON-NLS-1$
+               consumeExitTryBlock();  
+               break ;
+               
+       case 269 : // System.out.println("Catches ::= Catches CatchClause");  //$NON-NLS-1$
+               consumeCatches();  
+               break ;
+               
+       case 270 : // System.out.println("CatchClause ::= catch LPAREN FormalParameter RPAREN Block");  //$NON-NLS-1$
+               consumeStatementCatch() ;  
+               break ;
+               
+       case 272 : // System.out.println("PushLPAREN ::= LPAREN");  //$NON-NLS-1$
+               consumeLeftParen();  
+               break ;
+               
+       case 273 : // System.out.println("PushRPAREN ::= RPAREN");  //$NON-NLS-1$
+               consumeRightParen();  
+               break ;
+               
+       case 278 : // System.out.println("PrimaryNoNewArray ::= this");  //$NON-NLS-1$
+               consumePrimaryNoNewArrayThis();  
+               break ;
+               
+       case 279 : // System.out.println("PrimaryNoNewArray ::= PushLPAREN Expression PushRPAREN");  //$NON-NLS-1$
+               consumePrimaryNoNewArray();  
+               break ;
+               
+       case 282 : // System.out.println("PrimaryNoNewArray ::= Name DOT this");  //$NON-NLS-1$
+               consumePrimaryNoNewArrayNameThis();  
+               break ;
+               
+       case 283 : // System.out.println("PrimaryNoNewArray ::= Name DOT super");  //$NON-NLS-1$
+               consumePrimaryNoNewArrayNameSuper();  
+               break ;
+               
+       case 284 : // System.out.println("PrimaryNoNewArray ::= Name DOT class");  //$NON-NLS-1$
+               consumePrimaryNoNewArrayName();  
+               break ;
+               
+       case 285 : // System.out.println("PrimaryNoNewArray ::= ArrayType DOT class");  //$NON-NLS-1$
+               consumePrimaryNoNewArrayArrayType();  
+               break ;
+               
+       case 286 : // System.out.println("PrimaryNoNewArray ::= PrimitiveType DOT class");  //$NON-NLS-1$
+               consumePrimaryNoNewArrayPrimitiveType();  
+               break ;
+               
+       case 289 : // System.out.println("AllocationHeader ::= new ClassType LPAREN ArgumentListopt RPAREN");  //$NON-NLS-1$
+               consumeAllocationHeader();  
+               break ;
+               
+       case 290 : // System.out.println("ClassInstanceCreationExpression ::= new ClassType LPAREN...");  //$NON-NLS-1$
+               consumeClassInstanceCreationExpression();  
+               break ;
+               
+       case 291 : // System.out.println("ClassInstanceCreationExpression ::= Primary DOT new SimpleName...");  //$NON-NLS-1$
+               consumeClassInstanceCreationExpressionQualified() ;  
+               break ;
+               
+       case 292 : // System.out.println("ClassInstanceCreationExpression ::=...");  //$NON-NLS-1$
+               consumeClassInstanceCreationExpressionQualified() ;  
+               break ;
+               
+       case 293 : // System.out.println("ClassInstanceCreationExpressionName ::= Name DOT");  //$NON-NLS-1$
+               consumeClassInstanceCreationExpressionName() ;  
+               break ;
+               
+       case 294 : // System.out.println("ClassBodyopt ::=");  //$NON-NLS-1$
+               consumeClassBodyopt();  
+               break ;
+               
+       case 296 : // System.out.println("EnterAnonymousClassBody ::=");  //$NON-NLS-1$
+               consumeEnterAnonymousClassBody();  
+               break ;
+               
+       case 298 : // System.out.println("ArgumentList ::= ArgumentList COMMA Expression");  //$NON-NLS-1$
+               consumeArgumentList();  
+               break ;
+               
+       case 299 : // System.out.println("ArrayCreationHeader ::= new PrimitiveType DimWithOrWithOutExprs");  //$NON-NLS-1$
+               consumeArrayCreationHeader();  
+               break ;
+               
+       case 300 : // System.out.println("ArrayCreationHeader ::= new ClassOrInterfaceType...");  //$NON-NLS-1$
+               consumeArrayCreationHeader();  
+               break ;
+               
+       case 301 : // System.out.println("ArrayCreationWithoutArrayInitializer ::= new PrimitiveType...");  //$NON-NLS-1$
+               consumeArrayCreationExpressionWithoutInitializer();  
+               break ;
+               
+       case 302 : // System.out.println("ArrayCreationWithArrayInitializer ::= new PrimitiveType...");  //$NON-NLS-1$
+               consumeArrayCreationExpressionWithInitializer();  
+               break ;
+               
+       case 303 : // System.out.println("ArrayCreationWithoutArrayInitializer ::= new ClassOrInterfaceType...");  //$NON-NLS-1$
+               consumeArrayCreationExpressionWithoutInitializer();  
+               break ;
+               
+       case 304 : // System.out.println("ArrayCreationWithArrayInitializer ::= new ClassOrInterfaceType...");  //$NON-NLS-1$
+               consumeArrayCreationExpressionWithInitializer();  
+               break ;
+               
+       case 306 : // System.out.println("DimWithOrWithOutExprs ::= DimWithOrWithOutExprs DimWithOrWithOutExpr");  //$NON-NLS-1$
+               consumeDimWithOrWithOutExprs();  
+               break ;
+               
+       case 308 : // System.out.println("DimWithOrWithOutExpr ::= LBRACKET RBRACKET");  //$NON-NLS-1$
+               consumeDimWithOrWithOutExpr();  
+               break ;
+               
+       case 309 : // System.out.println("Dims ::= DimsLoop");  //$NON-NLS-1$
+               consumeDims();  
+               break ;
+               
+       case 312 : // System.out.println("OneDimLoop ::= LBRACKET RBRACKET");  //$NON-NLS-1$
+               consumeOneDimLoop();  
+               break ;
+               
+       case 313 : // System.out.println("FieldAccess ::= Primary DOT Identifier");  //$NON-NLS-1$
+               consumeFieldAccess(false);  
+               break ;
+               
+       case 314 : // System.out.println("FieldAccess ::= super DOT Identifier");  //$NON-NLS-1$
+               consumeFieldAccess(true);  
+               break ;
+               
+       case 315 : // System.out.println("MethodInvocation ::= Name LPAREN ArgumentListopt RPAREN");  //$NON-NLS-1$
+               consumeMethodInvocationName();  
+               break ;
+               
+       case 316 : // System.out.println("MethodInvocation ::= Primary DOT Identifier LPAREN ArgumentListopt");  //$NON-NLS-1$
+               consumeMethodInvocationPrimary();  
+               break ;
+               
+       case 317 : // System.out.println("MethodInvocation ::= super DOT Identifier LPAREN ArgumentListopt...");  //$NON-NLS-1$
+               consumeMethodInvocationSuper();  
+               break ;
+               
+       case 318 : // System.out.println("ArrayAccess ::= Name LBRACKET Expression RBRACKET");  //$NON-NLS-1$
+               consumeArrayAccess(true);  
+               break ;
+               
+       case 319 : // System.out.println("ArrayAccess ::= PrimaryNoNewArray LBRACKET Expression RBRACKET");  //$NON-NLS-1$
+               consumeArrayAccess(false);  
+               break ;
+               
+       case 320 : // System.out.println("ArrayAccess ::= ArrayCreationWithArrayInitializer LBRACKET...");  //$NON-NLS-1$
+               consumeArrayAccess(false);  
+               break ;
+               
+       case 322 : // System.out.println("PostfixExpression ::= Name");  //$NON-NLS-1$
+               consumePostfixExpression();  
+               break ;
+               
+       case 325 : // System.out.println("PostIncrementExpression ::= PostfixExpression PLUS_PLUS");  //$NON-NLS-1$
+               consumeUnaryExpression(OperatorIds.PLUS,true);  
+               break ;
+               
+       case 326 : // System.out.println("PostDecrementExpression ::= PostfixExpression MINUS_MINUS");  //$NON-NLS-1$
+               consumeUnaryExpression(OperatorIds.MINUS,true);  
+               break ;
+               
+       case 327 : // System.out.println("PushPosition ::=");  //$NON-NLS-1$
+               consumePushPosition();  
+               break ;
+               
+       case 330 : // System.out.println("UnaryExpression ::= PLUS PushPosition UnaryExpression");  //$NON-NLS-1$
+               consumeUnaryExpression(OperatorIds.PLUS);  
+               break ;
+               
+       case 331 : // System.out.println("UnaryExpression ::= MINUS PushPosition UnaryExpression");  //$NON-NLS-1$
+               consumeUnaryExpression(OperatorIds.MINUS);  
+               break ;
+               
+       case 333 : // System.out.println("PreIncrementExpression ::= PLUS_PLUS PushPosition UnaryExpression");  //$NON-NLS-1$
+               consumeUnaryExpression(OperatorIds.PLUS,false);  
+               break ;
+               
+       case 334 : // System.out.println("PreDecrementExpression ::= MINUS_MINUS PushPosition UnaryExpression");  //$NON-NLS-1$
+               consumeUnaryExpression(OperatorIds.MINUS,false);  
+               break ;
+               
+       case 336 : // System.out.println("UnaryExpressionNotPlusMinus ::= TWIDDLE PushPosition UnaryExpression");  //$NON-NLS-1$
+               consumeUnaryExpression(OperatorIds.TWIDDLE);  
+               break ;
+               
+       case 337 : // System.out.println("UnaryExpressionNotPlusMinus ::= NOT PushPosition UnaryExpression");  //$NON-NLS-1$
+               consumeUnaryExpression(OperatorIds.NOT);  
+               break ;
+               
+       case 339 : // System.out.println("CastExpression ::= PushLPAREN PrimitiveType Dimsopt PushRPAREN...");  //$NON-NLS-1$
+               consumeCastExpression();  
+               break ;
+               
+       case 340 : // System.out.println("CastExpression ::= PushLPAREN Name Dims PushRPAREN...");  //$NON-NLS-1$
+               consumeCastExpression();  
+               break ;
+               
+       case 341 : // System.out.println("CastExpression ::= PushLPAREN Expression PushRPAREN...");  //$NON-NLS-1$
+               consumeCastExpressionLL1();  
+               break ;
+               
+       case 342 : // System.out.println("InsideCastExpression ::=");  //$NON-NLS-1$
+               consumeInsideCastExpression();  
+               break ;
+               
+       case 343 : // System.out.println("InsideCastExpressionLL1 ::=");  //$NON-NLS-1$
+               consumeInsideCastExpressionLL1();  
+               break ;
+               
+       case 345 : // System.out.println("MultiplicativeExpression ::= MultiplicativeExpression MULTIPLY...");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.MULTIPLY);  
+               break ;
+               
+       case 346 : // System.out.println("MultiplicativeExpression ::= MultiplicativeExpression DIVIDE...");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.DIVIDE);  
+               break ;
+               
+       case 347 : // System.out.println("MultiplicativeExpression ::= MultiplicativeExpression REMAINDER...");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.REMAINDER);  
+               break ;
+               
+       case 349 : // System.out.println("AdditiveExpression ::= AdditiveExpression PLUS...");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.PLUS);  
+               break ;
+               
+       case 350 : // System.out.println("AdditiveExpression ::= AdditiveExpression MINUS...");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.MINUS);  
+               break ;
+               
+       case 352 : // System.out.println("ShiftExpression ::= ShiftExpression LEFT_SHIFT AdditiveExpression");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.LEFT_SHIFT);  
+               break ;
+               
+       case 353 : // System.out.println("ShiftExpression ::= ShiftExpression RIGHT_SHIFT AdditiveExpression");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.RIGHT_SHIFT);  
+               break ;
+               
+       case 354 : // System.out.println("ShiftExpression ::= ShiftExpression UNSIGNED_RIGHT_SHIFT...");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.UNSIGNED_RIGHT_SHIFT);  
+               break ;
+               
+       case 356 : // System.out.println("RelationalExpression ::= RelationalExpression LESS ShiftExpression");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.LESS);  
+               break ;
+               
+       case 357 : // System.out.println("RelationalExpression ::= RelationalExpression GREATER...");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.GREATER);  
+               break ;
+               
+       case 358 : // System.out.println("RelationalExpression ::= RelationalExpression LESS_EQUAL...");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.LESS_EQUAL);  
+               break ;
+               
+       case 359 : // System.out.println("RelationalExpression ::= RelationalExpression GREATER_EQUAL...");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.GREATER_EQUAL);  
+               break ;
+               
+       case 360 : // System.out.println("RelationalExpression ::= RelationalExpression instanceof...");  //$NON-NLS-1$
+               consumeInstanceOfExpression(OperatorIds.INSTANCEOF);  
+               break ;
+               
+       case 362 : // System.out.println("EqualityExpression ::= EqualityExpression EQUAL_EQUAL...");  //$NON-NLS-1$
+               consumeEqualityExpression(OperatorIds.EQUAL_EQUAL);  
+               break ;
+               
+       case 363 : // System.out.println("EqualityExpression ::= EqualityExpression NOT_EQUAL...");  //$NON-NLS-1$
+               consumeEqualityExpression(OperatorIds.NOT_EQUAL);  
+               break ;
+               
+       case 365 : // System.out.println("AndExpression ::= AndExpression AND EqualityExpression");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.AND);  
+               break ;
+               
+       case 367 : // System.out.println("ExclusiveOrExpression ::= ExclusiveOrExpression XOR AndExpression");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.XOR);  
+               break ;
+               
+       case 369 : // System.out.println("InclusiveOrExpression ::= InclusiveOrExpression OR...");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.OR);  
+               break ;
+               
+       case 371 : // System.out.println("ConditionalAndExpression ::= ConditionalAndExpression AND_AND...");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.AND_AND);  
+               break ;
+               
+       case 373 : // System.out.println("ConditionalOrExpression ::= ConditionalOrExpression OR_OR...");  //$NON-NLS-1$
+               consumeBinaryExpression(OperatorIds.OR_OR);  
+               break ;
+               
+       case 375 : // System.out.println("ConditionalExpression ::= ConditionalOrExpression QUESTION...");  //$NON-NLS-1$
+               consumeConditionalExpression(OperatorIds.QUESTIONCOLON) ;  
+               break ;
+               
+       case 378 : // System.out.println("Assignment ::= PostfixExpression AssignmentOperator...");  //$NON-NLS-1$
+               consumeAssignment();  
+               break ;
+               
+       case 380 : // System.out.println("Assignment ::= InvalidArrayInitializerAssignement");  //$NON-NLS-1$
+               ignoreExpressionAssignment(); 
+               break ;
+               
+       case 381 : // System.out.println("AssignmentOperator ::= EQUAL");  //$NON-NLS-1$
+               consumeAssignmentOperator(EQUAL);  
+               break ;
+               
+       case 382 : // System.out.println("AssignmentOperator ::= MULTIPLY_EQUAL");  //$NON-NLS-1$
+               consumeAssignmentOperator(MULTIPLY);  
+               break ;
+               
+       case 383 : // System.out.println("AssignmentOperator ::= DIVIDE_EQUAL");  //$NON-NLS-1$
+               consumeAssignmentOperator(DIVIDE);  
+               break ;
+               
+       case 384 : // System.out.println("AssignmentOperator ::= REMAINDER_EQUAL");  //$NON-NLS-1$
+               consumeAssignmentOperator(REMAINDER);  
+               break ;
+               
+       case 385 : // System.out.println("AssignmentOperator ::= PLUS_EQUAL");  //$NON-NLS-1$
+               consumeAssignmentOperator(PLUS);  
+               break ;
+               
+       case 386 : // System.out.println("AssignmentOperator ::= MINUS_EQUAL");  //$NON-NLS-1$
+               consumeAssignmentOperator(MINUS);  
+               break ;
+               
+       case 387 : // System.out.println("AssignmentOperator ::= LEFT_SHIFT_EQUAL");  //$NON-NLS-1$
+               consumeAssignmentOperator(LEFT_SHIFT);  
+               break ;
+               
+       case 388 : // System.out.println("AssignmentOperator ::= RIGHT_SHIFT_EQUAL");  //$NON-NLS-1$
+               consumeAssignmentOperator(RIGHT_SHIFT);  
+               break ;
+               
+       case 389 : // System.out.println("AssignmentOperator ::= UNSIGNED_RIGHT_SHIFT_EQUAL");  //$NON-NLS-1$
+               consumeAssignmentOperator(UNSIGNED_RIGHT_SHIFT);  
+               break ;
+               
+       case 390 : // System.out.println("AssignmentOperator ::= AND_EQUAL");  //$NON-NLS-1$
+               consumeAssignmentOperator(AND);  
+               break ;
+               
+       case 391 : // System.out.println("AssignmentOperator ::= XOR_EQUAL");  //$NON-NLS-1$
+               consumeAssignmentOperator(XOR);  
+               break ;
+               
+       case 392 : // System.out.println("AssignmentOperator ::= OR_EQUAL");  //$NON-NLS-1$
+               consumeAssignmentOperator(OR);  
+               break ;
+               
+       case 399 : // System.out.println("Expressionopt ::=");  //$NON-NLS-1$
+               consumeEmptyExpression();  
+               break ;
+               
+       case 403 : // System.out.println("ImportDeclarationsopt ::=");  //$NON-NLS-1$
+               consumeEmptyImportDeclarationsopt();  
+               break ;
+               
+       case 404 : // System.out.println("ImportDeclarationsopt ::= ImportDeclarations");  //$NON-NLS-1$
+               consumeImportDeclarationsopt();  
+               break ;
+               
+       case 405 : // System.out.println("TypeDeclarationsopt ::=");  //$NON-NLS-1$
+               consumeEmptyTypeDeclarationsopt();  
+               break ;
+               
+       case 406 : // System.out.println("TypeDeclarationsopt ::= TypeDeclarations");  //$NON-NLS-1$
+               consumeTypeDeclarationsopt();  
+               break ;
+               
+       case 407 : // System.out.println("ClassBodyDeclarationsopt ::=");  //$NON-NLS-1$
+               consumeEmptyClassBodyDeclarationsopt();  
+               break ;
+               
+       case 408 : // System.out.println("ClassBodyDeclarationsopt ::= NestedType ClassBodyDeclarations");  //$NON-NLS-1$
+               consumeClassBodyDeclarationsopt();  
+               break ;
+               
+       case 409 : // System.out.println("Modifiersopt ::=");  //$NON-NLS-1$
+               consumeDefaultModifiers();  
+               break ;
+               
+       case 410 : // System.out.println("Modifiersopt ::= Modifiers");  //$NON-NLS-1$
+               consumeModifiers();  
+               break ;
+               
+       case 411 : // System.out.println("BlockStatementsopt ::=");  //$NON-NLS-1$
+               consumeEmptyBlockStatementsopt();  
+               break ;
+               
+       case 413 : // System.out.println("Dimsopt ::=");  //$NON-NLS-1$
+               consumeEmptyDimsopt();  
+               break ;
+               
+       case 415 : // System.out.println("ArgumentListopt ::=");  //$NON-NLS-1$
+               consumeEmptyArgumentListopt();  
+               break ;
+               
+       case 419 : // System.out.println("FormalParameterListopt ::=");  //$NON-NLS-1$
+               consumeFormalParameterListopt();  
+               break ;
+               
+       case 423 : // System.out.println("InterfaceMemberDeclarationsopt ::=");  //$NON-NLS-1$
+               consumeEmptyInterfaceMemberDeclarationsopt();  
+               break ;
+               
+       case 424 : // System.out.println("InterfaceMemberDeclarationsopt ::= NestedType...");  //$NON-NLS-1$
+               consumeInterfaceMemberDeclarationsopt();  
+               break ;
+               
+       case 425 : // System.out.println("NestedType ::=");  //$NON-NLS-1$
+               consumeNestedType();  
+               break ;
+
+       case 426 : // System.out.println("ForInitopt ::=");  //$NON-NLS-1$
+               consumeEmptyForInitopt();  
+               break ;
+               
+       case 428 : // System.out.println("ForUpdateopt ::=");  //$NON-NLS-1$
+               consumeEmptyForUpdateopt();  
+               break ;
+               
+       case 432 : // System.out.println("Catchesopt ::=");  //$NON-NLS-1$
+               consumeEmptyCatchesopt();  
+               break ;
+               
+       }
+} 
+protected void consumeSimpleAssertStatement() {
+       // AssertStatement ::= 'assert' Expression ';'
+       this.expressionLengthPtr--;
+       pushOnAstStack(new AssertStatement(this.expressionStack[this.expressionPtr--], this.intStack[this.intPtr--]));  
+}
+       
+protected void consumeSingleTypeImportDeclaration() {
+       // SingleTypeImportDeclaration ::= SingleTypeImportDeclarationName ';'
+
+       ImportReference impt = (ImportReference) this.astStack[this.astPtr];
+       // flush comments defined prior to import statements
+       impt.declarationEnd = this.endStatementPosition;
+       impt.declarationSourceEnd = 
+               this.flushCommentsDefinedPriorTo(impt.declarationSourceEnd); 
+
+       // recovery
+       if (this.currentElement != null) {
+               this.lastCheckPoint = impt.declarationSourceEnd + 1;
+               this.currentElement = this.currentElement.add(impt, 0);
+               this.lastIgnoredToken = -1;
+               this.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 = this.identifierLengthStack[this.identifierLengthPtr--]][];
+       this.identifierPtr -= length;
+       long[] positions = new long[length];
+       System.arraycopy(this.identifierStack, this.identifierPtr + 1, tokens, 0, length);
+       System.arraycopy(this.identifierPositionStack, this.identifierPtr + 1, positions, 0, length);
+       pushOnAstStack(impt = new ImportReference(tokens, positions, false, AccDefault));
+
+       if (this.currentToken == TokenNameSEMICOLON){
+               impt.declarationSourceEnd = this.scanner.currentPosition - 1;
+       } else {
+               impt.declarationSourceEnd = impt.sourceEnd;
+       }
+       impt.declarationEnd = impt.declarationSourceEnd;
+       //endPosition is just before the ;
+       impt.declarationSourceStart = this.intStack[this.intPtr--];
+
+       // recovery
+       if (this.currentElement != null){
+               this.lastCheckPoint = impt.declarationSourceEnd+1;
+               this.currentElement = this.currentElement.add(impt, 0);
+               this.lastIgnoredToken = -1;
+               this.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 BreakStatement(null, this.intStack[this.intPtr--], this.endPosition));
+}
+protected void consumeStatementBreakWithLabel() {
+       // BreakStatement ::= 'break' Identifier ';'
+       // break pushs a position on intStack in case there is no label
+
+       pushOnAstStack(
+               new BreakStatement(
+                       this.identifierStack[this.identifierPtr--],
+                       this.intStack[this.intPtr--],
+                       this.endPosition)); 
+       this.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
+
+       this.astLengthPtr--;
+       this.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 ContinueStatement(
+                       null,
+                       this.intStack[this.intPtr--],
+                       this.endPosition));
+}
+protected void consumeStatementContinueWithLabel() {
+       // ContinueStatement ::= 'continue' Identifier ';'
+       // continue pushs a position on intStack in case there is no label
+
+       pushOnAstStack(
+               new ContinueStatement(
+                       this.identifierStack[this.identifierPtr--], 
+                       this.intStack[this.intPtr--], 
+                       this.endPosition)); 
+       this.identifierLengthPtr--;
+}
+protected void consumeStatementDo() {
+       // DoStatement ::= 'do' Statement 'while' '(' Expression ')' ';'
+
+       //the 'while' pushes a value on intStack that we need to remove
+       this.intPtr--;
+
+       Statement statement = (Statement) this.astStack[this.astPtr];
+       this.expressionLengthPtr--;
+       this.astStack[this.astPtr] = 
+               new DoStatement(
+                       this.expressionStack[this.expressionPtr--], 
+                       statement, 
+                       this.intStack[this.intPtr--], 
+                       this.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;
+       boolean scope = true;
+
+       //statements
+       this.astLengthPtr--;
+       Statement statement = (Statement) this.astStack[this.astPtr--];
+
+       //updates are on the expresion stack
+       if ((length = this.expressionLengthStack[this.expressionLengthPtr--]) == 0) {
+               updates = null;
+       } else {
+               this.expressionPtr -= length;
+               System.arraycopy(
+                       this.expressionStack, 
+                       this.expressionPtr + 1, 
+                       updates = new Statement[length], 
+                       0, 
+                       length); 
+       }
+
+       if (this.expressionLengthStack[this.expressionLengthPtr--] != 0)
+               cond = this.expressionStack[this.expressionPtr--];
+
+       //inits may be on two different stacks
+       if ((length = this.astLengthStack[this.astLengthPtr--]) == 0) {
+               inits = null;
+               scope = false;
+       } else {
+               if (length == -1) { //on expressionStack
+                       scope = false;
+                       length = this.expressionLengthStack[this.expressionLengthPtr--];
+                       this.expressionPtr -= length;
+                       System.arraycopy(
+                               this.expressionStack, 
+                               this.expressionPtr + 1, 
+                               inits = new Statement[length], 
+                               0, 
+                               length); 
+               } else { //on astStack
+                       this.astPtr -= length;
+                       System.arraycopy(
+                               this.astStack, 
+                               this.astPtr + 1, 
+                               inits = new Statement[length], 
+                               0, 
+                               length); 
+               }
+       }
+       pushOnAstStack(
+               new ForStatement(
+                       inits, 
+                       cond, 
+                       updates, 
+                       statement, 
+                       scope, 
+                       this.intStack[this.intPtr--], 
+                       this.endStatementPosition)); 
+}
+protected void consumeStatementIfNoElse() {
+       // IfThenStatement ::=  'if' '(' Expression ')' Statement
+
+       //optimize the push/pop
+       this.expressionLengthPtr--;
+       Statement thenStatement = (Statement) this.astStack[this.astPtr];
+       this.astStack[this.astPtr] = 
+               new IfStatement(
+                       this.expressionStack[this.expressionPtr--], 
+                       thenStatement, 
+                       this.intStack[this.intPtr--], 
+                       this.endStatementPosition); 
+}
+protected void consumeStatementIfWithElse() {
+       // IfThenElseStatement ::=  'if' '(' Expression ')' StatementNoShortIf 'else' Statement
+       // IfThenElseStatementNoShortIf ::=  'if' '(' Expression ')' StatementNoShortIf 'else' StatementNoShortIf
+
+       this.expressionLengthPtr--;
+
+       // optimized {..., Then, Else } ==> {..., If }
+       this.astLengthPtr--;
+
+       //optimize the push/pop
+       this.astStack[--this.astPtr] = 
+               new IfStatement(
+                       this.expressionStack[this.expressionPtr--], 
+                       (Statement) this.astStack[this.astPtr], 
+                       (Statement) this.astStack[this.astPtr + 1], 
+                       this.intStack[this.intPtr--], 
+                       this.endStatementPosition); 
+}
+protected void consumeStatementLabel() {
+       // LabeledStatement ::= 'Identifier' ':' Statement
+       // LabeledStatementNoShortIf ::= 'Identifier' ':' StatementNoShortIf
+
+       //optimize push/pop
+       Statement stmt = (Statement) this.astStack[this.astPtr];
+       this.astStack[this.astPtr] = 
+               new LabeledStatement(
+                       this.identifierStack[this.identifierPtr], 
+                       stmt, 
+                       (int) (this.identifierPositionStack[this.identifierPtr--] >>> 32), 
+                       this.endStatementPosition); 
+       this.identifierLengthPtr--;
+}
+protected void consumeStatementReturn() {
+       // ReturnStatement ::= 'return' Expressionopt ';'
+       // return pushs a position on intStack in case there is no expression
+
+       if (this.expressionLengthStack[this.expressionLengthPtr--] != 0) {
+               pushOnAstStack(
+                       new ReturnStatement(
+                               this.expressionStack[this.expressionPtr--], 
+                               this.intStack[this.intPtr--], 
+                               this.endPosition)
+               );
+       } else {
+               pushOnAstStack(new ReturnStatement(null, this.intStack[this.intPtr--], this.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 switchStatement = new SwitchStatement();
+       this.expressionLengthPtr--;
+       switchStatement.expression = this.expressionStack[this.expressionPtr--];
+       if ((length = this.astLengthStack[this.astLengthPtr--]) != 0) {
+               this.astPtr -= length;
+               System.arraycopy(
+                       this.astStack, 
+                       this.astPtr + 1, 
+                       switchStatement.statements = new Statement[length], 
+                       0, 
+                       length); 
+       }
+       switchStatement.explicitDeclarations = this.realBlockStack[this.realBlockPtr--];
+       pushOnAstStack(switchStatement);
+       switchStatement.blockStart = this.intStack[this.intPtr--];
+       switchStatement.sourceStart = this.intStack[this.intPtr--];
+       switchStatement.sourceEnd = this.endStatementPosition;
+       if (length == 0 && !containsComment(switchStatement.blockStart, switchStatement.sourceEnd)) {
+               switchStatement.bits |= ASTNode.UndocumentedEmptyBlockMASK;
+       }
+}
+protected void consumeStatementSynchronized() {
+       // SynchronizedStatement ::= OnlySynchronized '(' Expression ')' Block
+       //optimize the push/pop
+
+       if (this.astLengthStack[this.astLengthPtr] == 0) {
+               this.astLengthStack[this.astLengthPtr] = 1;
+               this.expressionLengthPtr--;
+               this.astStack[++this.astPtr] = 
+                       new SynchronizedStatement(
+                               this.expressionStack[this.expressionPtr--], 
+                               null, 
+                               this.intStack[this.intPtr--], 
+                               this.endStatementPosition); 
+       } else {
+               this.expressionLengthPtr--;
+               this.astStack[this.astPtr] = 
+                       new SynchronizedStatement(
+                               this.expressionStack[this.expressionPtr--], 
+                               (Block) this.astStack[this.astPtr], 
+                               this.intStack[this.intPtr--], 
+                               this.endStatementPosition); 
+       }
+       resetModifiers();
+}
+protected void consumeStatementThrow() {
+       // ThrowStatement ::= 'throw' Expression ';'
+       this.expressionLengthPtr--;
+       pushOnAstStack(new ThrowStatement(this.expressionStack[this.expressionPtr--], this.intStack[this.intPtr--]));
+}
+protected void consumeStatementTry(boolean withFinally) {
+       //TryStatement ::= 'try'  Block Catches
+       //TryStatement ::= 'try'  Block Catchesopt Finally
+
+       int length;
+       TryStatement tryStmt = new TryStatement();
+       //finally
+       if (withFinally) {
+               this.astLengthPtr--;
+               tryStmt.finallyBlock = (Block) this.astStack[this.astPtr--];
+       }
+       //catches are handle by two <argument-block> [see statementCatch]
+       if ((length = this.astLengthStack[this.astLengthPtr--]) != 0) {
+               if (length == 1) {
+                       tryStmt.catchBlocks = new Block[] {(Block) this.astStack[this.astPtr--]};
+                       tryStmt.catchArguments = new Argument[] {(Argument) this.astStack[this.astPtr--]};
+               } else {
+                       Block[] bks = (tryStmt.catchBlocks = new Block[length]);
+                       Argument[] args = (tryStmt.catchArguments = new Argument[length]);
+                       while (length-- > 0) {
+                               bks[length] = (Block) this.astStack[this.astPtr--];
+                               args[length] = (Argument) this.astStack[this.astPtr--];
+                       }
+               }
+       }
+       //try
+       this.astLengthPtr--;
+       tryStmt.tryBlock = (Block) this.astStack[this.astPtr--];
+
+       //positions
+       tryStmt.sourceEnd = this.endStatementPosition;
+       tryStmt.sourceStart = this.intStack[this.intPtr--];
+       pushOnAstStack(tryStmt);
+}
+protected void consumeStatementWhile() {
+       // WhileStatement ::= 'while' '(' Expression ')' Statement
+       // WhileStatementNoShortIf ::= 'while' '(' Expression ')' StatementNoShortIf
+
+       this.expressionLengthPtr--;
+       Statement statement = (Statement) this.astStack[this.astPtr];
+       this.astStack[this.astPtr] = 
+               new WhileStatement(
+                       this.expressionStack[this.expressionPtr--], 
+                       statement, 
+                       this.intStack[this.intPtr--], 
+                       this.endStatementPosition); 
+}
+protected void consumeStaticInitializer() {
+       // StaticInitializer ::=  StaticOnly Block
+       //push an Initializer
+       //optimize the push/pop
+       Block block = (Block) this.astStack[this.astPtr];
+       if (this.diet) block.bits &= ~ASTNode.UndocumentedEmptyBlockMASK; // clear bit set since was diet
+       Initializer initializer = new Initializer(block, AccStatic);
+       this.astStack[this.astPtr] = initializer;
+       initializer.sourceEnd = this.endStatementPosition;      
+       initializer.declarationSourceEnd = flushCommentsDefinedPriorTo(this.endStatementPosition);
+       this.nestedMethod[this.nestedType] --;
+       initializer.declarationSourceStart = this.intStack[this.intPtr--];
+       initializer.bodyStart = this.intStack[this.intPtr--];
+       initializer.bodyEnd = this.endPosition;
+       // doc comment
+       initializer.javadoc = this.javadoc;
+       this.javadoc = null;
+       
+       // recovery
+       if (this.currentElement != null){
+               this.lastCheckPoint = initializer.declarationSourceEnd;
+               this.currentElement = this.currentElement.add(initializer, 0);
+               this.lastIgnoredToken = -1;
+       }
+}
+protected void consumeStaticOnly() {
+       // StaticOnly ::= 'static'
+       int savedModifiersSourceStart = this.modifiersSourceStart;
+       checkComment(); // might update declaration source start
+       if (this.modifiersSourceStart >= savedModifiersSourceStart) {
+               this.modifiersSourceStart = savedModifiersSourceStart;
+       }
+       pushOnIntStack(this.scanner.currentPosition);
+       pushOnIntStack(
+               this.modifiersSourceStart >= 0 ? this.modifiersSourceStart : this.scanner.startPosition);
+       jumpOverMethodBody();
+       this.nestedMethod[this.nestedType]++;
+       resetModifiers();
+
+       // recovery
+       if (this.currentElement != null){
+               this.recoveredStaticInitializerStart = this.intStack[this.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 */
+       checkNonExternalizedStringLiteral();
+//     // 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:
+//                     this.scanner.commentPtr = -1;
+//     }
+       //System.out.println(this.scanner.toStringAction(type));
+       switch (type) {
+               case TokenNameIdentifier :
+                       pushIdentifier();
+                       if (this.scanner.useAssertAsAnIndentifier) {
+                               long positions = this.identifierPositionStack[this.identifierPtr];
+                               problemReporter().useAssertAsAnIdentifier((int) (positions >>> 32), (int) positions);
+                       }
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNameinterface :
+                       adjustInterfaceModifiers();
+                       //'class' is pushing two int (positions) on the stack ==> 'interface' needs to do it too....
+                       pushOnIntStack(this.scanner.currentPosition - 1);                       
+                       pushOnIntStack(this.scanner.startPosition);
+//                     this.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 = this.scanner.startPosition; 
+                       checkAndSetModifiers(AccSynchronized);
+                       break;
+                       //==============================
+               case TokenNamevoid :
+                       pushIdentifier(-T_void);
+                       pushOnIntStack(this.scanner.currentPosition - 1);                               
+                       pushOnIntStack(this.scanner.startPosition);
+//                     this.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(this.scanner.currentPosition - 1);                               
+                       pushOnIntStack(this.scanner.startPosition);             
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNamebyte :
+                       pushIdentifier(-T_byte);
+                       pushOnIntStack(this.scanner.currentPosition - 1);                               
+                       pushOnIntStack(this.scanner.startPosition);                                     
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNamechar :
+                       pushIdentifier(-T_char);
+                       pushOnIntStack(this.scanner.currentPosition - 1);                               
+                       pushOnIntStack(this.scanner.startPosition);                                     
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNamedouble :
+                       pushIdentifier(-T_double);
+                       pushOnIntStack(this.scanner.currentPosition - 1);                               
+                       pushOnIntStack(this.scanner.startPosition);                                     
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNamefloat :
+                       pushIdentifier(-T_float);
+                       pushOnIntStack(this.scanner.currentPosition - 1);                               
+                       pushOnIntStack(this.scanner.startPosition);                                     
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNameint :
+                       pushIdentifier(-T_int);
+                       pushOnIntStack(this.scanner.currentPosition - 1);                               
+                       pushOnIntStack(this.scanner.startPosition);                                     
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNamelong :
+                       pushIdentifier(-T_long);
+                       pushOnIntStack(this.scanner.currentPosition - 1);                               
+                       pushOnIntStack(this.scanner.startPosition);                                     
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNameshort :
+                       pushIdentifier(-T_short);
+                       pushOnIntStack(this.scanner.currentPosition - 1);                               
+                       pushOnIntStack(this.scanner.startPosition);                                     
+//                     this.scanner.commentPtr = -1;
+                       break;
+                       //==============================
+               case TokenNameIntegerLiteral :
+                       pushOnExpressionStack(
+                               new IntLiteral(
+                                       this.scanner.getCurrentTokenSource(), 
+                                       this.scanner.startPosition, 
+                                       this.scanner.currentPosition - 1)); 
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNameLongLiteral :
+                       pushOnExpressionStack(
+                               new LongLiteral(
+                                       this.scanner.getCurrentTokenSource(), 
+                                       this.scanner.startPosition, 
+                                       this.scanner.currentPosition - 1)); 
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNameFloatingPointLiteral :
+                       pushOnExpressionStack(
+                               new FloatLiteral(
+                                       this.scanner.getCurrentTokenSource(), 
+                                       this.scanner.startPosition, 
+                                       this.scanner.currentPosition - 1)); 
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNameDoubleLiteral :
+                       pushOnExpressionStack(
+                               new DoubleLiteral(
+                                       this.scanner.getCurrentTokenSource(), 
+                                       this.scanner.startPosition, 
+                                       this.scanner.currentPosition - 1)); 
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNameCharacterLiteral :
+                       pushOnExpressionStack(
+                               new CharLiteral(
+                                       this.scanner.getCurrentTokenSource(), 
+                                       this.scanner.startPosition, 
+                                       this.scanner.currentPosition - 1)); 
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNameStringLiteral :
+                       StringLiteral stringLiteral = new StringLiteral(
+                                       this.scanner.getCurrentTokenSourceString(), 
+                                       this.scanner.startPosition, 
+                                       this.scanner.currentPosition - 1); 
+                       pushOnExpressionStack(stringLiteral); 
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNamefalse :
+                       pushOnExpressionStack(
+                               new FalseLiteral(this.scanner.startPosition, this.scanner.currentPosition - 1)); 
+//                     this.scanner.commentPtr = -1;
+                       break;
+               case TokenNametrue :
+                       pushOnExpressionStack(
+                               new TrueLiteral(this.scanner.startPosition, this.scanner.currentPosition - 1)); 
+                       break;
+               case TokenNamenull :
+                       pushOnExpressionStack(
+                               new NullLiteral(this.scanner.startPosition, this.scanner.currentPosition - 1)); 
+                       break;
+                       //============================
+               case TokenNamesuper :
+               case TokenNamethis :
+                       this.endPosition = this.scanner.currentPosition - 1;
+                       pushOnIntStack(this.scanner.startPosition);
+                       break;
+               case TokenNameassert :
+               case TokenNameimport :
+               case TokenNamepackage :
+               case TokenNamethrow :
+               case TokenNamedo :
+               case TokenNameif :
+               case TokenNamefor :
+               case TokenNameswitch :
+               case TokenNametry :
+               case TokenNamewhile :
+               case TokenNamebreak :
+               case TokenNamecontinue :
+               case TokenNamereturn :
+               case TokenNamecase :
+                       pushOnIntStack(this.scanner.startPosition);
+                       break;
+               case TokenNamenew :
+                       // https://bugs.eclipse.org/bugs/show_bug.cgi?id=40954
+                       resetModifiers();
+                       pushOnIntStack(this.scanner.startPosition);
+                       break;
+               case TokenNameclass :
+                       pushOnIntStack(this.scanner.currentPosition - 1);
+                       pushOnIntStack(this.scanner.startPosition);
+                       break;
+               case TokenNamedefault :
+                       pushOnIntStack(this.scanner.startPosition);
+                       pushOnIntStack(this.scanner.currentPosition - 1);
+                       break;
+                       //let extra semantic action decide when to push
+               case TokenNameRBRACKET :
+               case TokenNamePLUS :
+               case TokenNameMINUS :
+               case TokenNameNOT :
+               case TokenNameTWIDDLE :
+                       this.endPosition = this.scanner.startPosition;
+                       break;
+               case TokenNamePLUS_PLUS :
+               case TokenNameMINUS_MINUS :
+                       this.endPosition = this.scanner.startPosition;
+                       this.endStatementPosition = this.scanner.currentPosition - 1;
+                       break;
+               case TokenNameRBRACE:
+               case TokenNameSEMICOLON :
+                       this.endStatementPosition = this.scanner.currentPosition - 1;
+                       this.endPosition = this.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 :
+                       this.rParenPos = this.scanner.currentPosition - 1; // position of the end of right parenthesis (in case of unicode \u0029) lex00101
+                       break;
+               case TokenNameLPAREN :
+                       this.lParenPos = this.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 = this.astLengthStack[this.astLengthPtr--]) != 0) {
+               this.astPtr -= length;
+               System.arraycopy(this.astStack, this.astPtr + 1, this.compilationUnit.types = new TypeDeclaration[length], 0, length);
+       }
+}
+protected void consumeTypeImportOnDemandDeclaration() {
+       // TypeImportOnDemandDeclaration ::= TypeImportOnDemandDeclarationName ';'
+
+       ImportReference impt = (ImportReference) this.astStack[this.astPtr];
+       // flush comments defined prior to import statements
+       impt.declarationEnd = this.endStatementPosition;
+       impt.declarationSourceEnd = 
+               this.flushCommentsDefinedPriorTo(impt.declarationSourceEnd); 
+
+       // recovery
+       if (this.currentElement != null) {
+               this.lastCheckPoint = impt.declarationSourceEnd + 1;
+               this.currentElement = this.currentElement.add(impt, 0);
+               this.restartRecovery = true;
+               this.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 = this.identifierLengthStack[this.identifierLengthPtr--]][];
+       this.identifierPtr -= length;
+       long[] positions = new long[length];
+       System.arraycopy(this.identifierStack, this.identifierPtr + 1, tokens, 0, length);
+       System.arraycopy(this.identifierPositionStack, this.identifierPtr + 1, positions, 0, length);
+       pushOnAstStack(impt = new ImportReference(tokens, positions, true, AccDefault));
+
+       if (this.currentToken == TokenNameSEMICOLON){
+               impt.declarationSourceEnd = this.scanner.currentPosition - 1;
+       } else {
+               impt.declarationSourceEnd = impt.sourceEnd;
+       }
+       impt.declarationEnd = impt.declarationSourceEnd;
+       //endPosition is just before the ;
+       impt.declarationSourceStart = this.intStack[this.intPtr--];
+
+       // recovery
+       if (this.currentElement != null){
+               this.lastCheckPoint = impt.declarationSourceEnd+1;
+               this.currentElement = this.currentElement.add(impt, 0);
+               this.lastIgnoredToken = -1;
+               this.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 = this.expressionStack[this.expressionPtr];
+       if (op == MINUS) {
+               if ((exp instanceof IntLiteral) && (((IntLiteral) exp).mayRepresentMIN_VALUE())) {
+                       r = this.expressionStack[this.expressionPtr] = new IntLiteralMinValue();
+               } else {
+                       if ((exp instanceof LongLiteral) && (((LongLiteral) exp).mayRepresentMIN_VALUE())) {
+                               r = this.expressionStack[this.expressionPtr] = new LongLiteralMinValue();
+                       } else {
+                               r = this.expressionStack[this.expressionPtr] = new UnaryExpression(exp, op);
+                       }
+               }
+       } else {
+               r = this.expressionStack[this.expressionPtr] = new UnaryExpression(exp, op);
+       }
+       r.sourceStart = this.intStack[this.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 = this.expressionStack[this.expressionPtr];
+       if (leftHandSide instanceof Reference) {
+               // ++foo()++ is unvalid 
+               if (post) {
+                       this.expressionStack[this.expressionPtr] = 
+                               new PostfixExpression(
+                                       leftHandSide,
+                                       IntLiteral.One,
+                                       op,
+                                       this.endStatementPosition); 
+               } else {
+                       this.expressionStack[this.expressionPtr] = 
+                               new PrefixExpression(
+                                       leftHandSide,
+                                       IntLiteral.One,
+                                       op,
+                                       this.intStack[this.intPtr--]); 
+               }
+       } else {
+               //the ++ or the -- is NOT taken into account if code gen proceeds
+               if (!post) {
+                       this.intPtr--;
+               }
+               problemReporter().invalidUnaryExpression(leftHandSide);
+       }
+}
+protected void consumeVariableDeclarators() {
+       // VariableDeclarators ::= VariableDeclarators ',' VariableDeclarator
+       optimizedConcatNodeLists();
+}
+protected void consumeVariableInitializers() {
+       // VariableInitializers ::= VariableInitializers ',' VariableInitializer
+       concatExpressionLists();
+}
+/**
+ * Given the current comment stack, answer whether some comment is available in a certain exclusive range
+ * 
+ * @param sourceStart int
+ * @param sourceEnd int
+ * @return boolean
+ */
+public boolean containsComment(int sourceStart, int sourceEnd) {
+       int iComment = this.scanner.commentPtr;
+       for (; iComment >= 0; iComment--) {
+               int commentStart = this.scanner.commentStarts[iComment];
+               // ignore comments before start
+               if (commentStart < sourceStart) continue;
+               // ignore comments after end
+               if (commentStart > sourceEnd) continue;
+               return true;
+       }
+       return false;
+}
+public MethodDeclaration convertToMethodDeclaration(ConstructorDeclaration c, CompilationResult compilationResult) {
+       MethodDeclaration m = new MethodDeclaration(compilationResult);
+       m.sourceStart = c.sourceStart;
+       m.sourceEnd = c.sourceEnd;
+       m.bodyStart = c.bodyStart;
+       m.bodyEnd = c.bodyEnd;
+       m.declarationSourceEnd = c.declarationSourceEnd;
+       m.declarationSourceStart = c.declarationSourceStart;
+       m.selector = c.selector;
+       m.statements = c.statements;
+       m.modifiers = c.modifiers;
+       m.arguments = c.arguments;
+       m.thrownExceptions = c.thrownExceptions;
+       m.explicitDeclarations = c.explicitDeclarations;
+       m.returnType = null;
+       return m;
+}
+protected TypeReference copyDims(TypeReference typeRef, int dim) {
+       return typeRef.copyDims(dim);
+}
+protected FieldDeclaration createFieldDeclaration(char[] fieldDeclarationName, int sourceStart, int sourceEnd) {
+       return new FieldDeclaration(fieldDeclarationName, sourceStart, sourceEnd);
+}
+
+protected LocalDeclaration createLocalDeclaration(char[] localDeclarationName, int sourceStart, int sourceEnd) {
+       return new LocalDeclaration(localDeclarationName, sourceStart, sourceEnd);
+}
+
+public CompilationUnitDeclaration dietParse(ICompilationUnit sourceUnit, CompilationResult compilationResult) {
+
+       CompilationUnitDeclaration parsedUnit;
+       boolean old = this.diet;
+       try {
+               this.diet = true;
+               parsedUnit = parse(sourceUnit, compilationResult);
+       }
+       finally {
+               this.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 = this.astStack[this.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) this.astStack[this.astPtr];
+       if (size1 != 0)
+               typeDecl.fields = new FieldDeclaration[size1];
+       if (size2 != 0)
+               typeDecl.methods = new AbstractMethodDeclaration[size2];
+       if (size3 != 0)
+               typeDecl.memberTypes = new TypeDeclaration[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(
+                                               this.astStack, 
+                                               this.astPtr + start + 1, 
+                                               typeDecl.fields, 
+                                               size1 - length2, 
+                                               length2); 
+                                       break;
+                               case 3 :
+                                       size2 += (length2 = end - start);
+                                       System.arraycopy(
+                                               this.astStack, 
+                                               this.astPtr + start + 1, 
+                                               typeDecl.methods, 
+                                               size2 - length2, 
+                                               length2); 
+                                       break;
+                               case 4 :
+                                       size3 += (length2 = end - start);
+                                       System.arraycopy(
+                                               this.astStack, 
+                                               this.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 (this.currentElement != null){
+               this.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(this.compilationUnit);               
+                       System.out.println("----------------------------------"); //$NON-NLS-1$
+               }               
+       } else {
+               if (this.diet & VERBOSE_RECOVERY){
+                       System.out.print(Util.bind("parser.regularParse"));      //$NON-NLS-1$
+                       System.out.println("--------------------------");        //$NON-NLS-1$
+                       System.out.println(this.compilationUnit);               
+                       System.out.println("----------------------------------"); //$NON-NLS-1$
+               }
+       }
+       persistLineSeparatorPositions();
+       for (int i = 0; i < this.scanner.foundTaskCount; i++){
+               problemReporter().task(
+                       new String(this.scanner.foundTaskTags[i]), 
+                       new String(this.scanner.foundTaskMessages[i]),
+                       this.scanner.foundTaskPriorities[i] == null ? null : new String(this.scanner.foundTaskPriorities[i]), 
+                       this.scanner.foundTaskPositions[i][0], 
+                       this.scanner.foundTaskPositions[i][1]);
+       }
+       return this.compilationUnit;
+}
+/*
+ * Flush comments defined prior to a given positions.
+ *
+ * Note: comments 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 flushCommentsDefinedPriorTo(int position) {
+
+       int lastCommentIndex = this.scanner.commentPtr;
+       if (lastCommentIndex < 0) return position; // no comment
+
+       // compute the index of the first obsolete comment
+       int index = lastCommentIndex;
+       int validCount = 0;
+       while (index >= 0){
+               int commentEnd = this.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 = -this.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 (this.scanner.getLineNumber(position) == this.scanner.getLineNumber(immediateCommentEnd)){
+                               position = immediateCommentEnd;
+                               validCount--; // flush this comment
+                               index++;
+                       }
+               }
+       }
+
+       if (index < 0) return position; // no obsolete comment
+
+       if (validCount > 0){ // move valid comment infos, overriding obsolete comment infos
+               System.arraycopy(this.scanner.commentStarts, index + 1, this.scanner.commentStarts, 0, validCount);
+               System.arraycopy(this.scanner.commentStops, index + 1, this.scanner.commentStops, 0, validCount);               
+       }
+       this.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 this.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 = this.scanner.commentPtr; i <= max; i++){
+               // javadoc only (non javadoc comment have negative end positions.)
+               if (this.scanner.commentStops[i] > 0){
+                       javadocCount++;
+               }
+       }
+       if (javadocCount == 0) return null;
+
+       int[] positions = new int[2*javadocCount];
+       int index = 0;
+       for (int i = 0, max = this.scanner.commentPtr; i <= max; i++){
+               // javadoc only (non javadoc comment have negative end positions.)
+               if (this.scanner.commentStops[i] > 0){
+                       positions[index++] = this.scanner.commentStarts[i];
+                       positions[index++] = this.scanner.commentStops[i]-1; //stop is one over                 
+               }
+       }
+       return positions;
+}
+       public 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.
+               }
+
+               if ((unit.bits & ASTNode.HasAllMethodBodies) != 0)
+                       return; //work already done ...
+
+               //real parse of the method....
+               char[] contents = unit.compilationResult.compilationUnit.getContents();
+               this.scanner.setSource(contents);
+               
+               // save existing values to restore them at the end of the parsing process
+               // see bug 47079 for more details
+               int[] oldLineEnds = this.scanner.lineEnds;
+               int oldLinePtr = this.scanner.linePtr;
+
+               final int[] lineSeparatorPositions = unit.compilationResult.lineSeparatorPositions;
+               this.scanner.lineEnds = lineSeparatorPositions;
+               this.scanner.linePtr = lineSeparatorPositions.length - 1;
+
+               if (this.javadocParser != null && this.javadocParser.checkDocComment) {
+                       this.javadocParser.scanner.setSource(contents);
+               }
+               if (unit.types != null) {
+                       for (int i = unit.types.length; --i >= 0;)
+                               unit.types[i].parseMethod(this, unit);
+               }
+               
+               // tag unit has having read bodies
+               unit.bits |= ASTNode.HasAllMethodBodies;
+
+               // this is done to prevent any side effects on the compilation unit result
+               // line separator positions array.
+               this.scanner.lineEnds = oldLineEnds;
+               this.scanner.linePtr = oldLinePtr;
+       }
+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 = this.identifierLengthStack[this.identifierLengthPtr--]) == 1) {
+               // single variable reference
+               if (dim == 0) {
+                       ref = 
+                               new SingleTypeReference(
+                                       this.identifierStack[this.identifierPtr], 
+                                       this.identifierPositionStack[this.identifierPtr--]); 
+               } else {
+                       ref = 
+                               new ArrayTypeReference(
+                                       this.identifierStack[this.identifierPtr], 
+                                       dim, 
+                                       this.identifierPositionStack[this.identifierPtr--]); 
+                       ref.sourceEnd = this.endPosition;                       
+               }
+       } else {
+               if (length < 0) { //flag for precompiled type reference on base types
+                       ref = TypeReference.baseTypeReference(-length, dim);
+                       ref.sourceStart = this.intStack[this.intPtr--];
+                       if (dim == 0) {
+                               ref.sourceEnd = this.intStack[this.intPtr--];
+                       } else {
+                               this.intPtr--;
+                               ref.sourceEnd = this.endPosition;
+                       }
+               } else { //Qualified variable reference
+                       char[][] tokens = new char[length][];
+                       this.identifierPtr -= length;
+                       long[] positions = new long[length];
+                       System.arraycopy(this.identifierStack, this.identifierPtr + 1, tokens, 0, length);
+                       System.arraycopy(
+                               this.identifierPositionStack, 
+                               this.identifierPtr + 1, 
+                               positions, 
+                               0, 
+                               length); 
+                       if (dim == 0) {
+                               ref = new QualifiedTypeReference(tokens, positions);
+                       } else {
+                               ref = new ArrayQualifiedTypeReference(tokens, dim, positions);
+                               ref.sourceEnd = this.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 = this.identifierLengthStack[this.identifierLengthPtr--]) == 1)
+               // single variable reference
+               ref = 
+                       new SingleNameReference(
+                               this.identifierStack[this.identifierPtr], 
+                               this.identifierPositionStack[this.identifierPtr--]); 
+       else
+               //Qualified variable reference
+               {
+               char[][] tokens = new char[length][];
+               this.identifierPtr -= length;
+               System.arraycopy(this.identifierStack, this.identifierPtr + 1, tokens, 0, length);
+               long[] positions = new long[length];
+               System.arraycopy(this.identifierPositionStack, this.identifierPtr + 1, positions, 0, length);
+               ref = 
+                       new QualifiedNameReference(tokens, 
+                               positions,
+                               (int) (this.identifierPositionStack[this.identifierPtr + 1] >> 32), // sourceStart
+                               (int) this.identifierPositionStack[this.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 = this.identifierLengthStack[this.identifierLengthPtr--]) == 1) {
+               // single variable reference
+               ref = 
+                       new SingleNameReference(
+                               this.identifierStack[this.identifierPtr], 
+                               this.identifierPositionStack[this.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][];
+       this.identifierPtr -= length;
+       System.arraycopy(this.identifierStack, this.identifierPtr + 1, tokens, 0, length);
+       long[] positions = new long[length];
+       System.arraycopy(this.identifierPositionStack, this.identifierPtr + 1, positions, 0, length);
+       ref = new QualifiedNameReference(
+                       tokens,
+                       positions, 
+                       (int) (this.identifierPositionStack[this.identifierPtr + 1] >> 32), // sourceStart
+                       (int) this.identifierPositionStack[this.identifierPtr + length]); // sourceEnd
+       ref.bits &= ~ASTNode.RestrictiveFlagMASK;
+       ref.bits |= LOCAL | FIELD;
+       return ref;
+}
+public void goForBlockStatementsopt() {
+       //tells the scanner to go for block statements opt parsing
+
+       this.firstToken = TokenNameTWIDDLE;
+       this.scanner.recordLineSeparator = false;
+}
+public void goForBlockStatementsOrCatchHeader() {
+       //tells the scanner to go for block statements or method headers parsing 
+
+       this.firstToken = TokenNameMULTIPLY;
+       this.scanner.recordLineSeparator = false;
+}
+public void goForClassBodyDeclarations() {
+       //tells the scanner to go for any body declarations parsing
+
+       this.firstToken = TokenNameAND;
+       this.scanner.recordLineSeparator = true;
+}
+public void goForCompilationUnit(){
+       //tells the scanner to go for compilation unit parsing
+
+       this.firstToken = TokenNamePLUS_PLUS ;
+       this.scanner.linePtr = -1;      
+       this.scanner.foundTaskCount = 0;
+       this.scanner.recordLineSeparator = true;
+       this.scanner.currentLine= null;
+}
+public void goForExpression() {
+       //tells the scanner to go for an expression parsing
+
+       this.firstToken = TokenNameREMAINDER;
+       this.scanner.recordLineSeparator = true; // recovery goals must record line separators
+}
+public void goForFieldDeclaration(){
+       //tells the scanner to go for field declaration parsing
+
+       this.firstToken = TokenNameAND_AND ;
+       this.scanner.recordLineSeparator = true;
+}
+public void goForGenericMethodDeclaration(){
+       //tells the scanner to go for generic method declarations parsing
+
+       this.firstToken = TokenNameDIVIDE;
+       this.scanner.recordLineSeparator = true;
+}
+public void goForHeaders(){
+       //tells the scanner to go for headers only parsing
+
+       this.firstToken = TokenNameUNSIGNED_RIGHT_SHIFT;
+       this.scanner.recordLineSeparator = true; // recovery goals must record line separators
+}
+public void goForImportDeclaration(){
+       //tells the scanner to go for import declaration parsing
+
+       this.firstToken = TokenNameOR_OR ;
+       this.scanner.recordLineSeparator = true;
+}
+public void goForInitializer(){
+       //tells the scanner to go for initializer parsing
+
+       this.firstToken = TokenNameRIGHT_SHIFT ;
+       this.scanner.recordLineSeparator = false;
+}
+public void goForMethodBody(){
+       //tells the scanner to go for method body parsing
+
+       this.firstToken = TokenNameMINUS_MINUS ;
+       this.scanner.recordLineSeparator = false;
+}
+public void goForPackageDeclaration() {
+       //tells the scanner to go for package declaration parsing
+
+       this.firstToken = TokenNameQUESTION;
+       this.scanner.recordLineSeparator = true;
+}
+public void goForTypeDeclaration() {
+       //tells the scanner to go for type (interface or class) declaration parsing
+
+       this.firstToken = TokenNamePLUS;
+       this.scanner.recordLineSeparator = true;
+}
+protected void ignoreExpressionAssignment() {
+       // Assignment ::= InvalidArrayInitializerAssignement
+       // encoded operator would be: this.intStack[this.intPtr]
+       this.intPtr--;
+       ArrayInitializer arrayInitializer = (ArrayInitializer) this.expressionStack[this.expressionPtr--];
+       this.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 = this.astLengthStack[this.astLengthPtr--]) != 0) {
+               //there are length declarations
+               //dispatch according to the type of the declarations
+               dispatchDeclarationInto(length);
+       }
+       
+       flushCommentsDefinedPriorTo(this.endStatementPosition);
+
+       // report the problem and continue parsing
+       TypeDeclaration typeDecl = (TypeDeclaration) this.astStack[this.astPtr];
+       typeDecl.bodyEnd = this.endStatementPosition;
+       problemReporter().cannotDeclareLocalInterface(typeDecl.name, typeDecl.sourceStart, typeDecl.sourceEnd);
+
+       // mark initializers with local type mark if needed
+       markInitializersWithLocalType(typeDecl);
+
+       // remove the ast node created in interface header
+       this.astPtr--;
+       pushOnAstLengthStack(-1);
+       concatNodeLists();
+}
+protected void ignoreInvalidConstructorDeclaration(boolean hasBody) {
+       // InvalidConstructorDeclaration ::= ConstructorHeader ConstructorBody ==> true
+       // InvalidConstructorDeclaration ::= ConstructorHeader ';' ==> false
+
+       /*
+       astStack : modifiers arguments throws statements
+       identifierStack : name
+        ==>
+       astStack : MethodDeclaration
+       identifierStack :
+       */
+       if (hasBody) {
+               // pop the position of the {  (body of the method) pushed in block decl
+               this.intPtr--;
+       }
+
+       //statements
+       if (hasBody) {
+               this.realBlockPtr--;
+       }
+
+       int length;
+       if (hasBody && ((length = this.astLengthStack[this.astLengthPtr--]) != 0)) {
+               this.astPtr -= length;
+       }
+       ConstructorDeclaration constructorDeclaration = (ConstructorDeclaration) this.astStack[this.astPtr];
+       constructorDeclaration.bodyEnd = this.endStatementPosition;
+       constructorDeclaration.declarationSourceEnd = flushCommentsDefinedPriorTo(this.endStatementPosition);
+       if (!hasBody) {
+               constructorDeclaration.modifiers |= AccSemicolonBody;
+       }
+}
+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
+       this.intPtr--;
+       // retrieve end position of method declarator
+
+       //statements
+       this.realBlockPtr--;
+       int length;
+       if ((length = this.astLengthStack[this.astLengthPtr--]) != 0) {
+               this.astPtr -= length;
+       }
+
+       //watch for } that could be given as a unicode ! ( u007D is '}' )
+       MethodDeclaration md = (MethodDeclaration) this.astStack[this.astPtr];
+       md.bodyEnd = this.endPosition;
+       md.declarationSourceEnd = flushCommentsDefinedPriorTo(this.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....
+       this.astPtr = -1;
+       this.astLengthPtr = -1;
+       this.expressionPtr = -1;
+       this.expressionLengthPtr = -1;
+       this.identifierPtr = -1;        
+       this.identifierLengthPtr        = -1;
+       this.intPtr = -1;
+       this.nestedMethod[this.nestedType = 0] = 0; // need to reset for further reuse
+       this.variablesCounter[this.nestedType] = 0;
+       this.dimensions = 0 ;
+       this.realBlockPtr = -1;
+       this.compilationUnit = null;
+       this.referenceContext = null;
+       this.endStatementPosition = 0;
+
+       //remove objects from stack too, while the same parser/compiler couple is
+       //re-used between two compilations ....
+       
+       int astLength = this.astStack.length;
+       if (this.noAstNodes.length < astLength){
+               this.noAstNodes = new ASTNode[astLength];
+               //System.out.println("Resized AST stacks : "+ astLength);
+               
+       }
+       System.arraycopy(this.noAstNodes, 0, this.astStack, 0, astLength);
+
+       int expressionLength = this.expressionStack.length;
+       if (this.noExpressions.length < expressionLength){
+               this.noExpressions = new Expression[expressionLength];
+               //System.out.println("Resized EXPR stacks : "+ expressionLength);
+       }
+       System.arraycopy(this.noExpressions, 0, this.expressionStack, 0, expressionLength);
+
+       // reset scanner state
+       this.scanner.commentPtr = -1;
+       this.scanner.foundTaskCount = 0;
+       this.scanner.eofPosition = Integer.MAX_VALUE;
+       this.scanner.wasNonExternalizedStringLiteral = false;
+       this.scanner.nonNLSStrings = null;
+       this.scanner.currentLine = null;        
+
+       resetModifiers();
+
+       // recovery
+       this.lastCheckPoint = -1;
+       this.currentElement = null;
+       this.restartRecovery = false;
+       this.hasReportedError = false;
+       this.recoveredStaticInitializerStart = 0;
+       this.lastIgnoredToken = -1;
+       this.lastErrorEndPosition = -1;
+       this.listLength = 0;
+       
+       this.rBraceStart = 0;
+       this.rBraceEnd = 0;
+       this.rBraceSuccessorStart = 0;
+}
+public void initializeScanner(){
+       this.scanner = new Scanner(
+               false /*comment*/, 
+               false /*whitespace*/, 
+               this.options.getSeverity(CompilerOptions.NonExternalizedString) != ProblemSeverities.Ignore /*nls*/, 
+               this.options.sourceLevel /*sourceLevel*/, 
+               this.options.taskTags/*taskTags*/,
+               this.options.taskPriorites/*taskPriorities*/,
+               this.options.isTaskCaseSensitive/*taskCaseSensitive*/);
+}
+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$
+       nasb = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       nasr = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       terminal_index = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       non_terminal_index = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       term_action = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       
+       scope_prefix = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       scope_suffix = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       scope_lhs = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       scope_state_set = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       scope_rhs = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       scope_state = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       in_symb = readTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       
+       rhs = readByteTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       term_check = readByteTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       scope_la = readByteTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       
+       name = readNameTable(prefix + (++i) + ".rsc"); //$NON-NLS-1$
+       readableName = readReadableNameTable(READABLE_NAMES);
+       
+       base_action = lhs;
+}
+public static int in_symbol(int state) {
+       return in_symb[original_state(state)];
+}
+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 (this.diet && (this.dietInt == 0))
+               this.scanner.diet = true;
+}
+protected void markEnclosingMemberWithLocalType() {
+       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 FieldDeclaration
+                               || node instanceof TypeDeclaration) { // mark type for now: all initializers 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 markInitializersWithLocalType(TypeDeclaration type) {
+       if (type.fields == null || (type.bits & ASTNode.HasLocalTypeMASK) == 0) return;
+       for (int i = 0, length = type.fields.length; i < length; i++) {
+               FieldDeclaration field = type.fields[i];
+               if (field instanceof Initializer) {
+                       field.bits |= ASTNode.HasLocalTypeMASK;
+               }
+       }
+}
+/*
+ * Move checkpoint location (current implementation is moving it by one token)
+ *
+ * Answers true if successfully moved checkpoint (in other words, it did not attempt to move it
+ * beyond end of file).
+ */
+protected boolean moveRecoveryCheckpoint() {
+
+       int pos = this.lastCheckPoint;
+       /* reset scanner, and move checkpoint by one token */
+       this.scanner.startPosition = pos;
+       this.scanner.currentPosition = pos;
+       this.scanner.diet = false; // quit jumping over method bodies
+       
+       /* if about to restart, then no need to shift token */
+       if (this.restartRecovery){
+               this.lastIgnoredToken = -1;
+               this.scanner.currentLine = null;
+               return true;
+       }
+       
+       /* protect against shifting on an invalid token */
+       this.lastIgnoredToken = this.nextIgnoredToken;
+       this.nextIgnoredToken = -1;
+       do {
+               try {
+                       this.nextIgnoredToken = this.scanner.getNextToken();
+                       if(this.scanner.currentPosition == this.scanner.startPosition){
+                               this.scanner.currentPosition++; // on fake completion identifier
+                               this.nextIgnoredToken = -1;
+                       }
+                       
+               } catch(InvalidInputException e){
+                       pos = this.scanner.currentPosition;
+               }
+       } while (this.nextIgnoredToken < 0);
+       
+       if (this.nextIgnoredToken == TokenNameEOF) { // no more recovery after this point
+               if (this.currentToken == TokenNameEOF) { // already tried one iteration on EOF
+                       this.scanner.currentLine = null;
+                       return false;
+               }
+       }
+       this.lastCheckPoint = this.scanner.currentPosition;
+       
+       /* reset scanner again to previous checkpoint location*/
+       this.scanner.startPosition = pos;
+       this.scanner.currentPosition = pos;
+       this.scanner.commentPtr = -1;
+       this.scanner.foundTaskCount = 0;
+       this.scanner.currentLine = null;
+
+       return true;
+
+/*
+       The following implementation moves the checkpoint location by one line:
+        
+       int pos = this.lastCheckPoint;
+       // reset scanner, and move checkpoint by one token
+       this.scanner.startPosition = pos;
+       this.scanner.currentPosition = pos;
+       this.scanner.diet = false; // quit jumping over method bodies
+       
+       // if about to restart, then no need to shift token
+       if (this.restartRecovery){
+               this.lastIgnoredToken = -1;
+               return true;
+       }
+       
+       // protect against shifting on an invalid token
+       this.lastIgnoredToken = this.nextIgnoredToken;
+       this.nextIgnoredToken = -1;
+       
+       boolean wasTokenizingWhiteSpace = this.scanner.tokenizeWhiteSpace;
+       this.scanner.tokenizeWhiteSpace = true;
+       checkpointMove: 
+               do {
+                       try {
+                               this.nextIgnoredToken = this.scanner.getNextToken();
+                               switch(this.nextIgnoredToken){
+                                       case Scanner.TokenNameWHITESPACE :
+                                               if(this.scanner.getLineNumber(this.scanner.startPosition)
+                                                       == this.scanner.getLineNumber(this.scanner.currentPosition)){
+                                                       this.nextIgnoredToken = -1;
+                                                       }
+                                               break;
+                                       case TokenNameSEMICOLON :
+                                       case TokenNameLBRACE :
+                                       case TokenNameRBRACE :
+                                               break;
+                                       case TokenNameIdentifier :
+                                               if(this.scanner.currentPosition == this.scanner.startPosition){
+                                                       this.scanner.currentPosition++; // on fake completion identifier
+                                               }
+                                       default:                                                
+                                               this.nextIgnoredToken = -1;
+                                               break;
+                                       case TokenNameEOF :
+                                               break checkpointMove;
+                               }
+                       } catch(InvalidInputException e){
+                               pos = this.scanner.currentPosition;
+                       }
+               } while (this.nextIgnoredToken < 0);
+       this.scanner.tokenizeWhiteSpace = wasTokenizingWhiteSpace;
+       
+       if (this.nextIgnoredToken == TokenNameEOF) { // no more recovery after this point
+               if (this.currentToken == TokenNameEOF) { // already tried one iteration on EOF
+                       return false;
+               }
+       }
+       this.lastCheckPoint = this.scanner.currentPosition;
+       
+       // reset scanner again to previous checkpoint location
+       this.scanner.startPosition = pos;
+       this.scanner.currentPosition = pos;
+       this.scanner.commentPtr = -1;
+
+       return true;
+*/
+}
+protected MessageSend newMessageSend() {
+       // '(' ArgumentListopt ')'
+       // the arguments are on the expression stack
+
+       MessageSend m = new MessageSend();
+       int length;
+       if ((length = this.expressionLengthStack[this.expressionLengthPtr--]) != 0) {
+               this.expressionPtr -= length;
+               System.arraycopy(
+                       this.expressionStack, 
+                       this.expressionPtr + 1, 
+                       m.arguments = new Expression[length], 
+                       0, 
+                       length); 
+       }
+       return m;
+}
+public static int nasi(int state) {
+       return nasb[original_state(state)];
+}
+public static int ntAction(int state, int sym) {
+       return base_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.
+        */
+
+       this.astLengthStack[--this.astLengthPtr]++;
+}
+protected static int original_state(int state) {
+       return -base_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() {
+       boolean isDietParse = this.diet;
+       int oldFirstToken = getFirstToken();
+       this.hasError = false;
+       
+       this.hasReportedError = false;
+       int act = START_STATE;
+       this.stateStackTop = -1;
+       this.currentToken = getFirstToken();
+       ProcessTerminals : for (;;) {
+               int stackLength = this.stack.length;
+               if (++this.stateStackTop >= stackLength) {
+                       System.arraycopy(
+                               this.stack, 0,
+                               this.stack = new int[stackLength + StackIncrement], 0,
+                               stackLength);
+               }
+               this.stack[this.stateStackTop] = act;
+
+               act = tAction(act, this.currentToken);
+
+               if (act == ERROR_ACTION || this.restartRecovery) {
+                       int errorPos = this.scanner.currentPosition;
+                       if (!this.hasReportedError){
+                               this.hasError = true;
+                       }
+                       if (resumeOnSyntaxError()) {
+                               if (act == ERROR_ACTION) this.lastErrorEndPosition = errorPos;
+                               act = START_STATE;
+                               this.stateStackTop = -1;
+                               this.currentToken = getFirstToken();
+                               continue ProcessTerminals;
+                       }
+                       act = ERROR_ACTION;
+                       break ProcessTerminals;
+               }
+               if (act <= NUM_RULES) {
+                       this.stateStackTop--;
+                       
+               } else if (act > ERROR_ACTION) { /* shift-reduce */
+                       consumeToken(this.currentToken);
+                       if (this.currentElement != null) this.recoveryTokenCheck();
+                       try {
+                               this.currentToken = this.scanner.getNextToken();
+                       } catch(InvalidInputException e){
+                               if (!this.hasReportedError){
+                                       this.problemReporter().scannerError(this, e.getMessage());
+                                       this.hasReportedError = true;
+                               }
+                               this.lastCheckPoint = this.scanner.currentPosition;
+                               this.restartRecovery = true;
+                       }                                       
+                       act -= ERROR_ACTION;
+                       
+               } else {
+                   if (act < ACCEPT_ACTION) { /* shift */
+                               consumeToken(this.currentToken);
+                               if (this.currentElement != null) this.recoveryTokenCheck();
+                               try{
+                                       this.currentToken = this.scanner.getNextToken();
+                               } catch(InvalidInputException e){
+                                       if (!this.hasReportedError){
+                                               this.problemReporter().scannerError(this, e.getMessage());
+                                               this.hasReportedError = true;
+                                       }
+                                       this.lastCheckPoint = this.scanner.currentPosition;
+                                       this.restartRecovery = true;
+                               }                                       
+                               continue ProcessTerminals;
+                       }
+                       break ProcessTerminals;
+               }
+               ProcessNonTerminals : do { /* reduce */
+                       consumeRule(act);
+                       this.stateStackTop -= (rhs[act] - 1);
+                       act = ntAction(this.stack[this.stateStackTop], lhs[act]);
+               } while (act <= NUM_RULES);
+       }
+       endParse(act);
+       
+       if (this.reportSyntaxErrorIsRequired && this.hasError) {
+               reportSyntaxErrors(isDietParse, oldFirstToken);
+       }
+}
+// A P I
+protected void reportSyntaxErrors(boolean isDietParse, int oldFirstToken) {
+       if(this.referenceContext instanceof MethodDeclaration) {
+               MethodDeclaration methodDeclaration = (MethodDeclaration) this.referenceContext;
+               if(methodDeclaration.errorInSignature){
+                       return;
+               }
+       }
+       this.compilationUnit.compilationResult.lineSeparatorPositions = this.scanner.getLineEnds();
+       this.scanner.recordLineSeparator = false;
+       
+       int start = this.scanner.initialPosition;
+       int end = this.scanner.eofPosition <= Integer.MAX_VALUE ? this.scanner.eofPosition - 1 : this.scanner.eofPosition;
+       if(isDietParse) {
+               TypeDeclaration[] types = this.compilationUnit.types;
+               
+               int[][] intervalToSkip = org.eclipse.jdt.internal.compiler.parser.diagnose.RangeUtil.computeDietRange(types);
+               DiagnoseParser diagnoseParser = new DiagnoseParser(this, oldFirstToken, start, end, intervalToSkip[0], intervalToSkip[1], intervalToSkip[2]);
+               diagnoseParser.diagnoseParse();
+               
+               reportSyntaxErrorsForSkippedMethod(types);
+               this.scanner.resetTo(start, end);
+       } else {
+               DiagnoseParser diagnoseParser = new DiagnoseParser(this, oldFirstToken, start, end);
+               diagnoseParser.diagnoseParse();
+       }
+}
+private void reportSyntaxErrorsForSkippedMethod(TypeDeclaration[] types){
+       if(types != null) {
+               for (int i = 0; i < types.length; i++) {
+                       TypeDeclaration[] memberTypes = types[i].memberTypes;
+                       if(memberTypes != null) {
+                               reportSyntaxErrorsForSkippedMethod(memberTypes);
+                       }
+                       
+                       AbstractMethodDeclaration[] methods = types[i].methods;
+                       if(methods != null) {
+                               for (int j = 0; j < methods.length; j++) {
+                                       AbstractMethodDeclaration method = methods[j];
+                                       if(methods[j].errorInSignature) {
+                                               DiagnoseParser diagnoseParser = new DiagnoseParser(this, TokenNameDIVIDE, method.declarationSourceStart, method.declarationSourceEnd);
+                                               diagnoseParser.diagnoseParse();
+                                       }
+                               }
+                       }
+                       
+                       FieldDeclaration[] fields = types[i].fields;
+                       if (fields != null) {
+                               int length = fields.length;
+                               for (int j = 0; j < length; j++) {
+                                       if (fields[j] instanceof Initializer) {
+                                               Initializer initializer = (Initializer)fields[j];
+                                               if(initializer.errorInSignature){
+                                                       DiagnoseParser diagnoseParser = new DiagnoseParser(this, TokenNameRIGHT_SHIFT, initializer.declarationSourceStart, initializer.declarationSourceEnd);
+                                                       diagnoseParser.diagnoseParse();
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+}
+public void parse(ConstructorDeclaration cd, CompilationUnitDeclaration unit) {
+       parse(cd, unit, false);
+}
+public void parse(ConstructorDeclaration cd, CompilationUnitDeclaration unit, boolean recordLineSeparator) {
+       //only parse the method body of cd
+       //fill out its statements
+
+       //convert bugs into parse error
+
+       initialize();
+       goForBlockStatementsopt();
+       if (recordLineSeparator) {
+               this.scanner.recordLineSeparator = true;
+       }
+       this.nestedMethod[this.nestedType]++;
+       pushOnRealBlockStack(0);
+       
+       this.referenceContext = cd;
+       this.compilationUnit = unit;
+
+       this.scanner.resetTo(cd.bodyStart, cd.bodyEnd);
+       try {
+               parse();
+       } catch (AbortCompilation ex) {
+               this.lastAct = ERROR_ACTION;
+       } finally {
+               this.nestedMethod[this.nestedType]--;
+       }
+
+       checkNonNLSAfterBodyEnd(cd.declarationSourceEnd);
+       
+       if (this.lastAct == ERROR_ACTION) {
+               initialize();
+               return;
+       }
+
+       //statements
+       cd.explicitDeclarations = this.realBlockStack[this.realBlockPtr--];
+       int length;
+       if ((length = this.astLengthStack[this.astLengthPtr--]) != 0) {
+               this.astPtr -= length;
+               if (this.astStack[this.astPtr + 1] instanceof ExplicitConstructorCall)
+                       //avoid a isSomeThing that would only be used here BUT what is faster between two alternatives ?
+                       {
+                       System.arraycopy(
+                               this.astStack, 
+                               this.astPtr + 2, 
+                               cd.statements = new Statement[length - 1], 
+                               0, 
+                               length - 1); 
+                       cd.constructorCall = (ExplicitConstructorCall) this.astStack[this.astPtr + 1];
+               } else { //need to add explicitly the super();
+                       System.arraycopy(
+                               this.astStack, 
+                               this.astPtr + 1, 
+                               cd.statements = new Statement[length], 
+                               0, 
+                               length); 
+                       cd.constructorCall = SuperReference.implicitSuperConstructorCall();
+               }
+       } else {
+               cd.constructorCall = SuperReference.implicitSuperConstructorCall();
+               if (!containsComment(cd.bodyStart, cd.bodyEnd)) {
+                       cd.bits |= ASTNode.UndocumentedEmptyBlockMASK;
+               }               
+       }
+
+       if (cd.constructorCall.sourceEnd == 0) {
+               cd.constructorCall.sourceEnd = cd.sourceEnd;
+               cd.constructorCall.sourceStart = cd.sourceStart;
+       }
+}
+// A P I
+
+public void parse(
+       FieldDeclaration field, 
+       TypeDeclaration type, 
+       CompilationUnitDeclaration unit,
+       char[] initializationSource) {
+       //only parse the initializationSource of the given field
+
+       //convert bugs into parse error
+
+       initialize();
+       goForExpression();
+       this.nestedMethod[this.nestedType]++;
+
+       this.referenceContext = type;
+       this.compilationUnit = unit;
+
+       this.scanner.setSource(initializationSource);
+       this.scanner.resetTo(0, initializationSource.length-1);
+       try {
+               parse();
+       } catch (AbortCompilation ex) {
+               this.lastAct = ERROR_ACTION;
+       } finally {
+               this.nestedMethod[this.nestedType]--;
+       }
+
+       if (this.lastAct == ERROR_ACTION) {
+               return;
+       }
+
+       field.initialization = this.expressionStack[this.expressionPtr];
+       
+       // mark field with local type if one was found during parsing
+       if ((type.bits & ASTNode.HasLocalTypeMASK) != 0) {
+               field.bits |= ASTNode.HasLocalTypeMASK;
+       }       
+}
+// A P I
+
+public void parse(
+       Initializer initializer, 
+       TypeDeclaration type, 
+       CompilationUnitDeclaration unit) {
+       //only parse the method body of md
+       //fill out method statements
+
+       //convert bugs into parse error
+
+       initialize();
+       goForBlockStatementsopt();
+       this.nestedMethod[this.nestedType]++;
+       pushOnRealBlockStack(0);
+       
+       this.referenceContext = type;
+       this.compilationUnit = unit;
+
+       this.scanner.resetTo(initializer.bodyStart, initializer.bodyEnd); // just on the beginning {
+       try {
+               parse();
+       } catch (AbortCompilation ex) {
+               this.lastAct = ERROR_ACTION;
+       } finally {
+               this.nestedMethod[this.nestedType]--;
+       }
+
+       checkNonNLSAfterBodyEnd(initializer.declarationSourceEnd);
+       
+       if (this.lastAct == ERROR_ACTION) {
+               return;
+       }
+       
+       //refill statements
+       initializer.block.explicitDeclarations = this.realBlockStack[this.realBlockPtr--];
+       int length;
+       if ((length = this.astLengthStack[this.astLengthPtr--]) > 0) {
+               System.arraycopy(this.astStack, (this.astPtr -= length) + 1, initializer.block.statements = new Statement[length], 0, length); 
+       } else {
+               // check whether this block at least contains some comment in it
+               if (!containsComment(initializer.block.sourceStart, initializer.block.sourceEnd)) {
+                       initializer.block.bits |= ASTNode.UndocumentedEmptyBlockMASK;
+               }
+       }
+       
+       // mark initializer with local type if one was found during parsing
+       if ((type.bits & ASTNode.HasLocalTypeMASK) != 0) {
+               initializer.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();
+       goForBlockStatementsopt();
+       this.nestedMethod[this.nestedType]++;
+       pushOnRealBlockStack(0);
+
+       this.referenceContext = md;
+       this.compilationUnit = unit;
+
+       this.scanner.resetTo(md.bodyStart, md.bodyEnd);
+       // reset the scanner to parser from { down to }
+       try {
+               parse();
+       } catch (AbortCompilation ex) {
+               this.lastAct = ERROR_ACTION;
+       } finally {
+               this.nestedMethod[this.nestedType]--;           
+       }
+
+       checkNonNLSAfterBodyEnd(md.declarationSourceEnd);
+       
+       if (this.lastAct == ERROR_ACTION) {
+               return;
+       }
+
+       //refill statements
+       md.explicitDeclarations = this.realBlockStack[this.realBlockPtr--];
+       int length;
+       if ((length = this.astLengthStack[this.astLengthPtr--]) != 0) {
+               System.arraycopy(
+                       this.astStack, 
+                       (this.astPtr -= length) + 1, 
+                       md.statements = new Statement[length], 
+                       0, 
+                       length); 
+       } else {
+               if (!containsComment(md.bodyStart, md.bodyEnd)) {
+                       md.bits |= ASTNode.UndocumentedEmptyBlockMASK;
+               }
+       }
+}
+// A P I
+
+public CompilationUnitDeclaration parse(
+       ICompilationUnit sourceUnit, 
+       CompilationResult compilationResult) {
+       // parses a compilation unit and manages error handling (even bugs....)
+
+       return parse(sourceUnit, compilationResult, -1, -1/*parse without reseting the scanner*/);
+}
+// 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();
+
+               /* scanners initialization */
+               char[] contents = sourceUnit.getContents();
+               this.scanner.setSource(contents);
+               if (end != -1) this.scanner.resetTo(start, end);
+               if (this.javadocParser != null && this.javadocParser.checkDocComment) {
+                       this.javadocParser.scanner.setSource(contents);
+                       if (end != -1) {
+                               this.javadocParser.scanner.resetTo(start, end);
+                       }
+               }
+               /* unit creation */
+               this.referenceContext = 
+                       this.compilationUnit = 
+                               new CompilationUnitDeclaration(
+                                       this.problemReporter, 
+                                       compilationResult, 
+                                       this.scanner.source.length);
+               /* run automaton */
+               parse();
+       } finally {
+               unit = this.compilationUnit;
+               this.compilationUnit = null; // reset parser
+               // tag unit has having read bodies
+               if (!this.diet) unit.bits |= ASTNode.HasAllMethodBodies;                
+       }
+       return unit;
+}
+public ASTNode[] parseClassBodyDeclarations(char[] source, int offset, int length, CompilationUnitDeclaration unit) {
+       /* automaton initialization */
+       initialize();
+       goForClassBodyDeclarations();
+       /* scanner initialization */
+       this.scanner.setSource(source);
+       this.scanner.resetTo(offset, offset + length - 1);
+       if (this.javadocParser != null && this.javadocParser.checkDocComment) {
+               this.javadocParser.scanner.setSource(source);
+               this.javadocParser.scanner.resetTo(offset, offset + length - 1);
+       }
+
+       /* type declaration should be parsed as member type declaration */      
+       this.nestedType = 1;
+
+       /* unit creation */
+       this.referenceContext = unit;
+       this.compilationUnit = unit;
+
+       /* run automaton */
+       try {
+               parse();
+       } catch (AbortCompilation ex) {
+               this.lastAct = ERROR_ACTION;
+       }
+
+       if (this.lastAct == ERROR_ACTION) {
+               return null;
+       }
+       int astLength;
+       if ((astLength = this.astLengthStack[this.astLengthPtr--]) != 0) {
+               ASTNode[] result = new ASTNode[astLength];
+               this.astPtr -= astLength;
+               System.arraycopy(this.astStack, this.astPtr + 1, result, 0, astLength);
+               return result;
+       }
+       return null;
+}
+public Expression parseExpression(char[] source, int offset, int length, CompilationUnitDeclaration unit) {
+
+       initialize();
+       goForExpression();
+       this.nestedMethod[this.nestedType]++;
+
+       this.referenceContext = unit;
+       this.compilationUnit = unit;
+
+       this.scanner.setSource(source);
+       this.scanner.resetTo(offset, offset + length - 1);
+       try {
+               parse();
+       } catch (AbortCompilation ex) {
+               this.lastAct = ERROR_ACTION;
+       } finally {
+               this.nestedMethod[this.nestedType]--;
+       }
+
+       if (this.lastAct == ERROR_ACTION) {
+               return null;
+       }
+
+       return this.expressionStack[this.expressionPtr];
+}
+public void persistLineSeparatorPositions() {
+       if (this.scanner.recordLineSeparator) {
+               this.compilationUnit.compilationResult.lineSeparatorPositions = this.scanner.getLineEnds();
+       }
+}
+/**
+ * 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.
+ * 
+ * @return ProblemReporter
+ */
+public ProblemReporter problemReporter(){
+       if (this.scanner.recordLineSeparator) {
+               this.compilationUnit.compilationResult.lineSeparatorPositions = this.scanner.getLineEnds();
+       }
+       this.problemReporter.referenceContext = this.referenceContext;
+       return this.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 */
+
+       int stackLength = this.identifierStack.length;
+       if (++this.identifierPtr >= stackLength) {
+               System.arraycopy(
+                       this.identifierStack, 0,
+                       this.identifierStack = new char[stackLength + 20][], 0,
+                       stackLength);
+               System.arraycopy(
+                       this.identifierPositionStack, 0,
+                       this.identifierPositionStack = new long[stackLength + 20], 0,
+                       stackLength);
+       }
+       this.identifierStack[this.identifierPtr] = this.scanner.getCurrentIdentifierSource();
+       this.identifierPositionStack[this.identifierPtr] =
+               (((long) this.scanner.startPosition) << 32) + (this.scanner.currentPosition - 1); 
+
+       stackLength = this.identifierLengthStack.length;
+       if (++this.identifierLengthPtr >= stackLength) {
+               System.arraycopy(
+                       this.identifierLengthStack, 0,
+                       this.identifierLengthStack = new int[stackLength + 10], 0,
+                       stackLength);
+       }
+       this.identifierLengthStack[this.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 */
+
+       int stackLength = this.identifierLengthStack.length;
+       if (++this.identifierLengthPtr >= stackLength) {
+               System.arraycopy(
+                       this.identifierLengthStack, 0,
+                       this.identifierLengthStack = new int[stackLength + 10], 0,
+                       stackLength);
+       }
+       this.identifierLengthStack[this.identifierLengthPtr] = flag;
+}
+protected void pushOnAstLengthStack(int pos) {
+
+       int stackLength = this.astLengthStack.length;
+       if (++this.astLengthPtr >= stackLength) {
+               System.arraycopy(
+                       this.astLengthStack, 0,
+                       this.astLengthStack = new int[stackLength + StackIncrement], 0,
+                       stackLength);
+       }
+       this.astLengthStack[this.astLengthPtr] = pos;
+}
+protected void pushOnAstStack(ASTNode node) {
+       /*add a new obj on top of the ast stack
+       astPtr points on the top*/
+
+       int stackLength = this.astStack.length;
+       if (++this.astPtr >= stackLength) {
+               System.arraycopy(
+                       this.astStack, 0,
+                       this.astStack = new ASTNode[stackLength + AstStackIncrement], 0,
+                       stackLength);
+               this.astPtr = stackLength;
+       }
+       this.astStack[this.astPtr] = node;
+
+       stackLength = this.astLengthStack.length;
+       if (++this.astLengthPtr >= stackLength) {
+               System.arraycopy(
+                       this.astLengthStack, 0,
+                       this.astLengthStack = new int[stackLength + AstStackIncrement], 0,
+                       stackLength);
+       }
+       this.astLengthStack[this.astLengthPtr] = 1;
+}
+protected void pushOnExpressionStack(Expression expr) {
+
+       int stackLength = this.expressionStack.length;
+       if (++this.expressionPtr >= stackLength) {
+               System.arraycopy(
+                       this.expressionStack, 0,
+                       this.expressionStack = new Expression[stackLength + ExpressionStackIncrement], 0,
+                       stackLength);
+       }
+       this.expressionStack[this.expressionPtr] = expr;
+
+       stackLength = this.expressionLengthStack.length;
+       if (++this.expressionLengthPtr >= stackLength) {
+               System.arraycopy(
+                       this.expressionLengthStack, 0,
+                       this.expressionLengthStack = new int[stackLength + ExpressionStackIncrement], 0,
+                       stackLength);
+       }
+       this.expressionLengthStack[this.expressionLengthPtr] = 1;
+}
+protected void pushOnExpressionStackLengthStack(int pos) {
+
+       int stackLength = this.expressionLengthStack.length;
+       if (++this.expressionLengthPtr >= stackLength) {
+               System.arraycopy(
+                       this.expressionLengthStack, 0,
+                       this.expressionLengthStack = new int[stackLength + StackIncrement], 0,
+                       stackLength);
+       }
+       this.expressionLengthStack[this.expressionLengthPtr] = pos;
+}
+protected void pushOnIntStack(int pos) {
+
+       int stackLength = this.intStack.length;
+       if (++this.intPtr >= stackLength) {
+               System.arraycopy(
+                       this.intStack, 0,
+                       this.intStack = new int[stackLength + StackIncrement], 0,
+                       stackLength);
+       }
+       this.intStack[this.intPtr] = pos;
+}
+protected void pushOnRealBlockStack(int i){
+       
+       int stackLength = this.realBlockStack.length;
+       if (++this.realBlockPtr >= stackLength) {
+               System.arraycopy(
+                       this.realBlockStack, 0,
+                       this.realBlockStack = new int[stackLength + StackIncrement], 0,
+                       stackLength);
+       }
+       this.realBlockStack[this.realBlockPtr] = i;
+}
+protected static char[] readTable(String filename) throws java.io.IOException {
+
+       //files are located at Parser.class directory
+
+       InputStream stream = Parser.class.getResourceAsStream(filename);
+       if (stream == null) {
+               throw new java.io.IOException(Util.bind("parser.missingFile",filename)); //$NON-NLS-1$
+       }
+       byte[] bytes = null;
+       try {
+               stream = new BufferedInputStream(stream);
+               bytes = Util.getInputStreamAsByteArray(stream, -1);
+       } finally {
+               try {
+                       stream.close();
+               } catch (IOException e) {
+                       // ignore
+               }
+       }
+
+       //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;
+}
+protected static byte[] readByteTable(String filename) throws java.io.IOException {
+
+       //files are located at Parser.class directory
+
+       InputStream stream = Parser.class.getResourceAsStream(filename);
+       if (stream == null) {
+               throw new java.io.IOException(Util.bind("parser.missingFile",filename)); //$NON-NLS-1$
+       }
+       byte[] bytes = null;
+       try {
+               stream = new BufferedInputStream(stream);
+               bytes = Util.getInputStreamAsByteArray(stream, -1);
+       } finally {
+               try {
+                       stream.close();
+               } catch (IOException e) {
+                       // ignore
+               }
+       }
+       return bytes;
+}
+protected static String[] readReadableNameTable(String filename) {
+       String[] result = new String[name.length];
+
+       ResourceBundle bundle;
+       try {
+               bundle = ResourceBundle.getBundle(filename, Locale.getDefault());
+       } catch(MissingResourceException e) {
+               System.out.println("Missing resource : " + filename.replace('.', '/') + ".properties for locale " + Locale.getDefault()); //$NON-NLS-1$//$NON-NLS-2$
+               throw e;
+       }
+       for (int i = 0; i < NT_OFFSET + 1; i++) {
+               result[i] = name[i];
+       }
+       for (int i = NT_OFFSET; i < name.length; i++) {
+               try {
+                       String n = bundle.getString(name[i]);
+                       if(n != null && n.length() > 0) {
+                               result[i] = n;
+                       } else {
+                               result[i] = name[i];
+                       }
+               } catch(MissingResourceException e) {
+                       result[i] = name[i];
+               }
+       }
+       return result;
+}
+       
+protected static String[] readNameTable(String filename) throws java.io.IOException {
+       char[] contents = readTable(filename);
+       char[][] nameAsChar = CharOperation.splitOn('\n', contents);
+
+       String[] result = new String[nameAsChar.length + 1];
+       result[0] = null;
+       for (int i = 0; i < nameAsChar.length; i++) {
+               result[i + 1] = new String(nameAsChar[i]);
+       }
+       
+       return result;
+}
+public void recoveryExitFromVariable() {
+       if(this.currentElement != null && this.currentElement.parent != null) {
+               if(this.currentElement instanceof RecoveredLocalVariable) {
+                       
+                       int end = ((RecoveredLocalVariable)this.currentElement).localDeclaration.sourceEnd;
+                       this.currentElement.updateSourceEndIfNecessary(end);
+                       this.currentElement = this.currentElement.parent;
+               } else if(this.currentElement instanceof RecoveredField
+                       && !(this.currentElement instanceof RecoveredInitializer)) {
+                               
+                       int end = ((RecoveredField)this.currentElement).fieldDeclaration.sourceEnd;
+                       this.currentElement.updateSourceEndIfNecessary(end);
+                       this.currentElement = this.currentElement.parent;
+               }
+       }
+}
+/* Token check performed on every token shift once having entered
+ * recovery mode.
+ */
+public void recoveryTokenCheck() {
+       switch (this.currentToken) {
+               case TokenNameLBRACE : 
+                       RecoveredElement newElement = null;
+                       if(!this.ignoreNextOpeningBrace) {
+                               newElement = this.currentElement.updateOnOpeningBrace(this.scanner.startPosition - 1, this.scanner.currentPosition - 1);
+                       }
+                       this.lastCheckPoint = this.scanner.currentPosition;                             
+                       if (newElement != null){ // null means nothing happened
+                               this.restartRecovery = true; // opening brace detected
+                               this.currentElement = newElement;
+                       }
+                       break;
+               
+               case TokenNameRBRACE : 
+                       this.rBraceStart = this.scanner.startPosition - 1;
+                       this.rBraceEnd = this.scanner.currentPosition - 1;
+                       this.endPosition = this.flushCommentsDefinedPriorTo(this.rBraceEnd);
+                       newElement =
+                               this.currentElement.updateOnClosingBrace(this.scanner.startPosition, this.rBraceEnd);
+                               this.lastCheckPoint = this.scanner.currentPosition;
+                       if (newElement != this.currentElement){
+                               this.currentElement = newElement;
+                       }
+                       break;
+               case TokenNameSEMICOLON :
+                       this.endStatementPosition = this.scanner.currentPosition - 1;
+                       this.endPosition = this.scanner.startPosition - 1; 
+                       // fall through
+               default : {
+                       if (this.rBraceEnd > this.rBraceSuccessorStart && this.scanner.currentPosition != this.scanner.startPosition){
+                               this.rBraceSuccessorStart = this.scanner.startPosition;
+                       }
+                       break;
+               }
+       }
+       this.ignoreNextOpeningBrace = false;
+}
+protected void resetModifiers() {
+       this.modifiers = AccDefault;
+       this.modifiersSourceStart = -1; // <-- see comment into modifiersFlag(int)
+       this.scanner.commentPtr = -1;
+}
+/*
+ * Reset context so as to resume to regular parse loop
+ */
+protected void resetStacks() {
+
+       this.astPtr = -1;
+       this.astLengthPtr = -1;
+       this.expressionPtr = -1;
+       this.expressionLengthPtr = -1;
+       this.identifierPtr = -1;        
+       this.identifierLengthPtr        = -1;
+       this.intPtr = -1;
+       this.nestedMethod[this.nestedType = 0] = 0; // need to reset for further reuse
+       this.variablesCounter[this.nestedType] = 0;
+       this.dimensions = 0 ;
+       this.realBlockStack[this.realBlockPtr = 0] = 0;
+       this.recoveredStaticInitializerStart = 0;
+       this.listLength = 0;
+       // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=29365
+       if (this.scanner != null) this.scanner.currentLine = null;
+}
+/*
+ * 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 javadoc before restart parsing after recovery
+       this.javadoc = null;
+
+       // reset internal stacks 
+       this.resetStacks();
+       
+       /* attempt to move checkpoint location */
+       if (!this.moveRecoveryCheckpoint()) {
+               return false;
+       }
+
+       // only look for headers
+       if (this.referenceContext instanceof CompilationUnitDeclaration){
+               goForHeaders();
+               this.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 (this.currentElement == null){
+               this.currentElement = 
+                       this.buildInitialRecoveryState(); // build some recovered elements
+       }
+       /* do not investigate deeper in recovery when no recovered element */
+       if (this.currentElement == null) return false;
+       
+       /* manual forced recovery restart - after headers */
+       if (this.restartRecovery){
+               this.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();
+}
+public static int tAction(int state, int sym) {
+       return term_action[term_check[base_action[state]+sym] == sym ? base_action[state] + sym : base_action[state]];
+}
+public String toString() {
+
+       String s = "identifierStack : char[][] = {"; //$NON-NLS-1$
+       for (int i = 0; i <= this.identifierPtr; i++) {
+               s = s + "\"" + String.valueOf(this.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 <= this.identifierLengthPtr; i++) {
+               s = s + this.identifierLengthStack[i] + ","; //$NON-NLS-1$
+       }
+       s = s + "}\n"; //$NON-NLS-1$
+
+       s = s + "astLengthStack : int[] = {"; //$NON-NLS-1$
+       for (int i = 0; i <= this.astLengthPtr; i++) {
+               s = s + this.astLengthStack[i] + ","; //$NON-NLS-1$
+       }
+       s = s + "}\n"; //$NON-NLS-1$
+       s = s + "astPtr : int = " + String.valueOf(this.astPtr) + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
+
+       s = s + "intStack : int[] = {"; //$NON-NLS-1$
+       for (int i = 0; i <= this.intPtr; i++) {
+               s = s + this.intStack[i] + ","; //$NON-NLS-1$
+       }
+       s = s + "}\n"; //$NON-NLS-1$
+
+       s = s + "expressionLengthStack : int[] = {"; //$NON-NLS-1$
+       for (int i = 0; i <= this.expressionLengthPtr; i++) {
+               s = s + this.expressionLengthStack[i] + ","; //$NON-NLS-1$
+       }
+       s = s + "}\n"; //$NON-NLS-1$
+
+       s = s + "expressionPtr : int = " + String.valueOf(this.expressionPtr) + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
+
+       s = s + "\n\n\n----------------Scanner--------------\n" + this.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 */
+       this.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 + this.astStack[this.astPtr - variableDeclaratorsCounter + 1].sourceStart; 
+       for (int i = 0; i < variableDeclaratorsCounter - 1; i++) {
+               //last one is special(see below)
+               field = (FieldDeclaration) this.astStack[this.astPtr - i - 1];
+               field.endPart1Position = endTypeDeclarationPosition;
+               field.endPart2Position = -1 + this.astStack[this.astPtr - i].sourceStart;
+       }
+       //last one
+       (field = (FieldDeclaration) this.astStack[this.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 = this.intStack[this.intPtr--];
+       exp.sourceStart = this.intStack[this.intPtr--];
+}
+}