/* Generated By:JavaCC: Do not edit this line. PHPParser.java */
package test;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.ui.texteditor.MarkerUtilities;
import org.eclipse.jface.preference.IPreferenceStore;

import java.util.Hashtable;
import java.util.ArrayList;
import java.io.StringReader;
import java.io.*;
import java.text.MessageFormat;

import net.sourceforge.phpeclipse.actions.PHPStartApacheAction;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import net.sourceforge.phpdt.internal.compiler.ast.*;
import net.sourceforge.phpdt.internal.compiler.parser.OutlineableWithChildren;
import net.sourceforge.phpdt.internal.compiler.parser.Outlineable;
import net.sourceforge.phpdt.internal.compiler.parser.PHPOutlineInfo;
import net.sourceforge.phpdt.internal.corext.Assert;

/**
 * A new php parser.
 * This php parser is inspired by the Java 1.2 grammar example
 * given with JavaCC. You can get JavaCC at http://www.webgain.com
 * You can test the parser with the PHPParserTestCase2.java
 * @author Matthieu Casanova
 */
public final class PHPParser extends PHPParserSuperclass implements PHPParserConstants {

//todo : fix the variables names bug
//todo : handle tilde operator


	/** The current segment. */
	private static OutlineableWithChildren currentSegment;

	private static final String PARSE_ERROR_STRING = "Parse error"; //$NON-NLS-1$
	private static final String PARSE_WARNING_STRING = "Warning"; //$NON-NLS-1$
	static PHPOutlineInfo outlineInfo;

	/** The error level of the current ParseException. */
	private static int errorLevel = ERROR;
	/** The message of the current ParseException. If it's null it's because the parse exception wasn't handled */
	private static String errorMessage;

	private static int errorStart = -1;
	private static int errorEnd = -1;
	private static PHPDocument phpDocument;

	private static final String SYNTAX_ERROR_CHAR = "syntax error";
	/**
	 * The point where html starts.
	 * It will be used by the token manager to create HTMLCode objects
	 */
	public static int htmlStart;

	//ast stack
	private final static int AstStackIncrement = 100;
	/** The stack of node. */
	private static AstNode[] nodes;
	/** The cursor in expression stack. */
	private static int nodePtr;

	public static final boolean PARSER_DEBUG = false;

	public final void setFileToParse(final IFile fileToParse) {
		PHPParser.fileToParse = fileToParse;
	}

	public PHPParser() {
	}

	public PHPParser(final IFile fileToParse) {
		this(new StringReader(""));
		PHPParser.fileToParse = fileToParse;
	}

	public final void phpParserTester(final String strEval) throws ParseException {
		final StringReader stream = new StringReader(strEval);
		if (jj_input_stream == null) {
			jj_input_stream = new SimpleCharStream(stream, 1, 1);
			token_source = new PHPParserTokenManager(jj_input_stream);
		}
		ReInit(new StringReader(strEval));
		init();
		phpDocument = new PHPDocument(null,"_root".toCharArray());
		currentSegment = phpDocument;
		outlineInfo = new PHPOutlineInfo(null, currentSegment);
		token_source.SwitchTo(PHPParserTokenManager.PHPPARSING);
		phpTest();
	}

	public final void htmlParserTester(final File fileName) throws FileNotFoundException, ParseException {
		final Reader stream = new FileReader(fileName);
		if (jj_input_stream == null) {
			jj_input_stream = new SimpleCharStream(stream, 1, 1);
			token_source = new PHPParserTokenManager(jj_input_stream);
		}
		ReInit(stream);
		init();
		phpDocument = new PHPDocument(null,"_root".toCharArray());
		currentSegment = phpDocument;
		outlineInfo = new PHPOutlineInfo(null, currentSegment);
		phpFile();
	}

	public final void htmlParserTester(final String strEval) throws ParseException {
		final StringReader stream = new StringReader(strEval);
		if (jj_input_stream == null) {
			jj_input_stream = new SimpleCharStream(stream, 1, 1);
			token_source = new PHPParserTokenManager(jj_input_stream);
		}
		ReInit(stream);
		init();
		phpDocument = new PHPDocument(null,"_root".toCharArray());
		currentSegment = phpDocument;
		outlineInfo = new PHPOutlineInfo(null, currentSegment);
		phpFile();
	}

	/**
	 * Reinitialize the parser.
	 */
	private static final void init() {
		nodes = new AstNode[AstStackIncrement];
		nodePtr = -1;
		htmlStart = 0;
	}

	/**
	 * Add an php node on the stack.
	 * @param node the node that will be added to the stack
	 */
	private static final void pushOnAstNodes(final AstNode node) {
		try {
			nodes[++nodePtr] = node;
		} catch (IndexOutOfBoundsException e) {
			final int oldStackLength = nodes.length;
			final AstNode[] oldStack = nodes;
			nodes = new AstNode[oldStackLength + AstStackIncrement];
			System.arraycopy(oldStack, 0, nodes, 0, oldStackLength);
			nodePtr = oldStackLength;
			nodes[nodePtr] = node;
		}
	}

	public final PHPOutlineInfo parseInfo(final Object parent, final String s) {
		phpDocument = new PHPDocument(parent,"_root".toCharArray());
		currentSegment = phpDocument;
		outlineInfo = new PHPOutlineInfo(parent, currentSegment);
		final StringReader stream = new StringReader(s);
		if (jj_input_stream == null) {
			jj_input_stream = new SimpleCharStream(stream, 1, 1);
			token_source = new PHPParserTokenManager(jj_input_stream);
		}
		ReInit(stream);
		init();
		try {
			parse();
			phpDocument.nodes = new AstNode[nodes.length];
			System.arraycopy(nodes,0,phpDocument.nodes,0,nodes.length);
			if (PHPeclipsePlugin.DEBUG) {
				PHPeclipsePlugin.log(1,phpDocument.toString());
			}
		} catch (ParseException e) {
			processParseException(e);
		}
		return outlineInfo;
	}

	/**
	 * This function will throw the exception if we are in debug mode
	 * and process it if we are in production mode.
	 * this should be fast since the PARSER_DEBUG is static final so the difference will be at compile time
	 * @param e the exception
	 * @throws ParseException the thrown exception
	 */
	private static void processParseExceptionDebug(final ParseException e) throws ParseException {
		if (PARSER_DEBUG) {
			throw e;
		}
		processParseException(e);
	}
	/**
	 * This method will process the parse exception.
	 * If the error message is null, the parse exception wasn't catched and a trace is written in the log
	 * @param e the ParseException
	 */
	private static void processParseException(final ParseException e) {
		if (errorMessage == null) {
			PHPeclipsePlugin.log(e);
			errorMessage = "this exception wasn't handled by the parser please tell us how to reproduce it";
			errorStart = e.currentToken.sourceStart;
			errorEnd   = e.currentToken.sourceEnd;
		}
		setMarker(e);
		errorMessage = null;
	//  if (PHPeclipsePlugin.DEBUG) PHPeclipsePlugin.log(e);
	}

	/**
	 * Create marker for the parse error.
	 * @param e the ParseException
	 */
	private static void setMarker(final ParseException e) {
		try {
			if (errorStart == -1) {
				setMarker(fileToParse,
									errorMessage,
									e.currentToken.sourceStart,
									e.currentToken.sourceEnd,
									errorLevel,
									"Line " + e.currentToken.beginLine+", "+e.currentToken.sourceStart+':'+e.currentToken.sourceEnd);
			} else {
				setMarker(fileToParse,
									errorMessage,
									errorStart,
									errorEnd,
									errorLevel,
									"Line " + e.currentToken.beginLine+", "+errorStart+':'+errorEnd);
				errorStart = -1;
				errorEnd = -1;
			}
		} catch (CoreException e2) {
			PHPeclipsePlugin.log(e2);
		}
	}

	private static void scanLine(final String output,
															 final IFile file,
															 final int indx,
															 final int brIndx) throws CoreException {
		String current;
		final StringBuffer lineNumberBuffer = new StringBuffer(10);
		char ch;
		current = output.substring(indx, brIndx);

		if (current.indexOf(PARSE_WARNING_STRING) != -1 || current.indexOf(PARSE_ERROR_STRING) != -1) {
			final int onLine = current.indexOf("on line <b>");
			if (onLine != -1) {
				lineNumberBuffer.delete(0, lineNumberBuffer.length());
				for (int i = onLine; i < current.length(); i++) {
					ch = current.charAt(i);
					if ('0' <= ch && '9' >= ch) {
						lineNumberBuffer.append(ch);
					}
				}

				final int lineNumber = Integer.parseInt(lineNumberBuffer.toString());

				final Hashtable attributes = new Hashtable();

				current = current.replaceAll("\n", "");
				current = current.replaceAll("<b>", "");
				current = current.replaceAll("</b>", "");
				MarkerUtilities.setMessage(attributes, current);

				if (current.indexOf(PARSE_ERROR_STRING) != -1)
					attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR));
				else if (current.indexOf(PARSE_WARNING_STRING) != -1)
					attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_WARNING));
				else
					attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_INFO));
				MarkerUtilities.setLineNumber(attributes, lineNumber);
				MarkerUtilities.createMarker(file, attributes, IMarker.PROBLEM);
			}
		}
	}

	public final void parse(final String s) {
		final StringReader stream = new StringReader(s);
		if (jj_input_stream == null) {
			jj_input_stream = new SimpleCharStream(stream, 1, 1);
			token_source = new PHPParserTokenManager(jj_input_stream);
		}
		ReInit(stream);
		init();
		try {
			parse();
		} catch (ParseException e) {
			processParseException(e);
		}
	}

	/**
	 * Call the php parse command ( php -l -f &lt;filename&gt; )
	 * and create markers according to the external parser output
	 */
	public static void phpExternalParse(final IFile file) {
		final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
		final String filename = file.getLocation().toString();

		final String[] arguments = { filename };
		final MessageFormat form = new MessageFormat(store.getString(PHPeclipsePlugin.EXTERNAL_PARSER_PREF));
		final String command = form.format(arguments);

		final String parserResult = PHPStartApacheAction.getParserOutput(command, "External parser: ");

		try {
			// parse the buffer to find the errors and warnings
			createMarkers(parserResult, file);
		} catch (CoreException e) {
			PHPeclipsePlugin.log(e);
		}
	}

	/**
	 * Put a new html block in the stack.
	 */
	public final void createNewHTMLCode() {
		final int currentPosition = token.sourceStart;
		if (currentPosition == htmlStart ||
					currentPosition < htmlStart ||
					currentPosition > jj_input_stream.getCurrentBuffer().length()) {
			return;
		}
		final String html = jj_input_stream.getCurrentBuffer().substring(htmlStart, currentPosition);
		pushOnAstNodes(new HTMLCode(html, htmlStart,currentPosition));
	}

	/** Create a new task. */
	public final void createNewTask(final int todoStart) {
		final String  todo = jj_input_stream.getCurrentBuffer().substring(todoStart,
																																	jj_input_stream.getCurrentBuffer().indexOf("\n",
																																																				 todoStart)-1);
		if (!PARSER_DEBUG) {
			try {
				setMarker(fileToParse,
									todo,
									jj_input_stream.getBeginLine(),
									TASK,
									"Line "+jj_input_stream.getBeginLine());
			} catch (CoreException e) {
				PHPeclipsePlugin.log(e);
			}
		}
	}

	private final void parse() throws ParseException {
					phpFile();
	}

	final public void todo() throws ParseException {
 Token todoToken;
		todoToken = jj_consume_token(23);
											createNewTask(todoToken.sourceStart);
	}

	final public void phpTest() throws ParseException {
		Php();
		jj_consume_token(0);
	}

	final public void phpFile() throws ParseException {
		try {
			label_1:
			while (true) {
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case PHPSTARTSHORT:
				case PHPSTARTLONG:
				case PHPECHOSTART:
				case PHPEND:
				case CLASS:
				case FUNCTION:
				case IF:
				case ARRAY:
				case BREAK:
				case LIST:
				case PRINT:
				case ECHO:
				case INCLUDE:
				case REQUIRE:
				case INCLUDE_ONCE:
				case REQUIRE_ONCE:
				case GLOBAL:
				case DEFINE:
				case STATIC:
				case CONTINUE:
				case DO:
				case FOR:
				case NEW:
				case NULL:
				case RETURN:
				case SWITCH:
				case TRUE:
				case FALSE:
				case WHILE:
				case FOREACH:
				case AT:
				case BANG:
				case TILDE:
				case PLUS_PLUS:
				case MINUS_MINUS:
				case PLUS:
				case MINUS:
				case BIT_AND:
				case INTEGER_LITERAL:
				case FLOATING_POINT_LITERAL:
				case STRING_LITERAL:
				case DOUBLEQUOTE:
				case DOLLAR:
				case IDENTIFIER:
				case LPAREN:
				case LBRACE:
				case SEMICOLON:
					;
					break;
				default:
					jj_la1[0] = jj_gen;
					break label_1;
				}
				PhpBlock();
			}
		 createNewHTMLCode();
		} catch (TokenMgrError e) {
		PHPeclipsePlugin.log(e);
		errorStart   = jj_input_stream.getBeginOffset();
		errorEnd     = jj_input_stream.getEndOffset();
		errorMessage = e.getMessage();
		errorLevel   = ERROR;
		{if (true) throw generateParseException();}
		}
	}

/**
 * A php block is a <?= expression [;]?>
 * or <?php somephpcode ?>
 * or <? somephpcode ?>
 */
	final public void PhpBlock() throws ParseException {
	final PHPEchoBlock phpEchoBlock;
	final Token token,phpEnd;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case PHPECHOSTART:
			phpEchoBlock = phpEchoBlock();
	 pushOnAstNodes(phpEchoBlock);
			break;
		case PHPSTARTSHORT:
		case PHPSTARTLONG:
		case PHPEND:
		case CLASS:
		case FUNCTION:
		case IF:
		case ARRAY:
		case BREAK:
		case LIST:
		case PRINT:
		case ECHO:
		case INCLUDE:
		case REQUIRE:
		case INCLUDE_ONCE:
		case REQUIRE_ONCE:
		case GLOBAL:
		case DEFINE:
		case STATIC:
		case CONTINUE:
		case DO:
		case FOR:
		case NEW:
		case NULL:
		case RETURN:
		case SWITCH:
		case TRUE:
		case FALSE:
		case WHILE:
		case FOREACH:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
		case LBRACE:
		case SEMICOLON:
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case PHPSTARTSHORT:
			case PHPSTARTLONG:
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case PHPSTARTLONG:
					jj_consume_token(PHPSTARTLONG);
					break;
				case PHPSTARTSHORT:
					token = jj_consume_token(PHPSTARTSHORT);
		 try {
			setMarker(fileToParse,
								"You should use '<?php' instead of '<?' it will avoid some problems with XML",
								token.sourceStart,
								token.sourceEnd,
								INFO,
								"Line " + token.beginLine);
		} catch (CoreException e) {
			PHPeclipsePlugin.log(e);
		}
					break;
				default:
					jj_la1[1] = jj_gen;
					jj_consume_token(-1);
					throw new ParseException();
				}
				break;
			default:
				jj_la1[2] = jj_gen;
				;
			}
	 createNewHTMLCode();
			Php();
			try {
				phpEnd = jj_consume_token(PHPEND);
		htmlStart = phpEnd.sourceEnd;
			} catch (ParseException e) {
		errorMessage = "'?>' expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		processParseExceptionDebug(e);
			}
			break;
		default:
			jj_la1[3] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
	}

	final public PHPEchoBlock phpEchoBlock() throws ParseException {
	final Expression expr;
	final PHPEchoBlock echoBlock;
	final Token token, token2;
		token = jj_consume_token(PHPECHOSTART);
													createNewHTMLCode();
		expr = Expression();
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case SEMICOLON:
			jj_consume_token(SEMICOLON);
			break;
		default:
			jj_la1[4] = jj_gen;
			;
		}
		token2 = jj_consume_token(PHPEND);
	htmlStart = token2.sourceEnd;

	echoBlock = new PHPEchoBlock(expr,token.sourceStart,token2.sourceEnd);
	pushOnAstNodes(echoBlock);
	{if (true) return echoBlock;}
		throw new Error("Missing return statement in function");
	}

	final public void Php() throws ParseException {
		label_2:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case CLASS:
			case FUNCTION:
			case IF:
			case ARRAY:
			case BREAK:
			case LIST:
			case PRINT:
			case ECHO:
			case INCLUDE:
			case REQUIRE:
			case INCLUDE_ONCE:
			case REQUIRE_ONCE:
			case GLOBAL:
			case DEFINE:
			case STATIC:
			case CONTINUE:
			case DO:
			case FOR:
			case NEW:
			case NULL:
			case RETURN:
			case SWITCH:
			case TRUE:
			case FALSE:
			case WHILE:
			case FOREACH:
			case AT:
			case BANG:
			case TILDE:
			case PLUS_PLUS:
			case MINUS_MINUS:
			case PLUS:
			case MINUS:
			case BIT_AND:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
			case DOLLAR:
			case IDENTIFIER:
			case LPAREN:
			case LBRACE:
			case SEMICOLON:
				;
				break;
			default:
				jj_la1[5] = jj_gen;
				break label_2;
			}
			BlockStatement();
		}
	}

	final public ClassDeclaration ClassDeclaration() throws ParseException {
	final ClassDeclaration classDeclaration;
	Token className = null;
	final Token superclassName, token, extendsToken;
	String classNameImage = SYNTAX_ERROR_CHAR;
	String superclassNameImage = null;
	final int classEnd;
		token = jj_consume_token(CLASS);
		try {
			className = jj_consume_token(IDENTIFIER);
		 classNameImage = className.image;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', identifier expected";
		errorLevel   = ERROR;
		errorStart   = token.sourceEnd+1;
		errorEnd     = token.sourceEnd+1;
		processParseExceptionDebug(e);
		}
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case EXTENDS:
			extendsToken = jj_consume_token(EXTENDS);
			try {
				superclassName = jj_consume_token(IDENTIFIER);
			 superclassNameImage = superclassName.image;
			} catch (ParseException e) {
			errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', identifier expected";
			errorLevel   = ERROR;
			errorStart = extendsToken.sourceEnd+1;
			errorEnd   = extendsToken.sourceEnd+1;
			processParseExceptionDebug(e);
			superclassNameImage = SYNTAX_ERROR_CHAR;
			}
			break;
		default:
			jj_la1[6] = jj_gen;
			;
		}
		int start, end;
		if (className == null) {
			start = token.sourceStart;
			end = token.sourceEnd;
		} else {
			start = className.sourceStart;
			end = className.sourceEnd;
		}
		if (superclassNameImage == null) {

			classDeclaration = new ClassDeclaration(currentSegment,
																							classNameImage,
																							start,
																							end);
		} else {
			classDeclaration = new ClassDeclaration(currentSegment,
																							classNameImage,
																							superclassNameImage,
																							start,
																							end);
		}
			currentSegment.add(classDeclaration);
			currentSegment = classDeclaration;
		classEnd = ClassBody(classDeclaration);
	 currentSegment = (OutlineableWithChildren) currentSegment.getParent();
	 classDeclaration.sourceEnd = classEnd;
	 pushOnAstNodes(classDeclaration);
	 {if (true) return classDeclaration;}
		throw new Error("Missing return statement in function");
	}

	final public int ClassBody(final ClassDeclaration classDeclaration) throws ParseException {
Token token;
		try {
			jj_consume_token(LBRACE);
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image + "'. '{' expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		processParseExceptionDebug(e);
		}
		label_3:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case FUNCTION:
			case VAR:
				;
				break;
			default:
				jj_la1[7] = jj_gen;
				break label_3;
			}
			ClassBodyDeclaration(classDeclaration);
		}
		try {
			token = jj_consume_token(RBRACE);
		 {if (true) return token.sourceEnd;}
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. 'var', 'function' or '}' expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		processParseExceptionDebug(e);
		{if (true) return this.token.sourceEnd;}
		}
		throw new Error("Missing return statement in function");
	}

/**
 * A class can contain only methods and fields.
 */
	final public void ClassBodyDeclaration(final ClassDeclaration classDeclaration) throws ParseException {
	final MethodDeclaration method;
	final FieldDeclaration field;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case FUNCTION:
			method = MethodDeclaration();
																method.analyzeCode();
																classDeclaration.addMethod(method);
			break;
		case VAR:
			field = FieldDeclaration();
																classDeclaration.addField(field);
			break;
		default:
			jj_la1[8] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
	}

/**
 * A class field declaration : it's var VariableDeclarator() (, VariableDeclarator())*;.
 * it is only used by ClassBodyDeclaration()
 */
	final public FieldDeclaration FieldDeclaration() throws ParseException {
	VariableDeclaration variableDeclaration;
	final VariableDeclaration[] list;
	final ArrayList arrayList = new ArrayList();
	final Token token;
	Token token2 = null;
	int pos;
		token = jj_consume_token(VAR);
		variableDeclaration = VariableDeclaratorNoSuffix();
		arrayList.add(variableDeclaration);
		pos = variableDeclaration.sourceEnd;
		label_4:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case COMMA:
				;
				break;
			default:
				jj_la1[9] = jj_gen;
				break label_4;
			}
			jj_consume_token(COMMA);
			variableDeclaration = VariableDeclaratorNoSuffix();
				arrayList.add(variableDeclaration);
				outlineInfo.addVariable(variableDeclaration.name());
				pos = variableDeclaration.sourceEnd;
		}
		try {
			token2 = jj_consume_token(SEMICOLON);
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected after variable declaration";
		errorLevel   = ERROR;
		errorStart   = pos+1;
		errorEnd     = pos+1;
		processParseExceptionDebug(e);
		}
	 list = new VariableDeclaration[arrayList.size()];
	 arrayList.toArray(list);
	 int end;
	 if (token2 == null) {
		 end = list[list.length-1].sourceEnd;
	 } else {
		 end = token2.sourceEnd;
	 }
	 {if (true) return new FieldDeclaration(list,
															 token.sourceStart,
															 end,
															 currentSegment);}
		throw new Error("Missing return statement in function");
	}

/**
 * a strict variable declarator : there cannot be a suffix here.
 * It will be used by fields and formal parameters
 */
	final public VariableDeclaration VariableDeclaratorNoSuffix() throws ParseException {
	final Token token, lbrace,rbrace;
	Expression expr, initializer = null;
	Token assignToken;
	Variable variable;
		jj_consume_token(DOLLAR);
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case IDENTIFIER:
			token = jj_consume_token(IDENTIFIER);
			variable = new Variable(token.image,token.sourceStart,token.sourceEnd);
			break;
		case LBRACE:
			lbrace = jj_consume_token(LBRACE);
			expr = Expression();
			rbrace = jj_consume_token(RBRACE);
			variable = new Variable(expr,lbrace.sourceStart,rbrace.sourceEnd);
			break;
		default:
			jj_la1[10] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ASSIGN:
			assignToken = jj_consume_token(ASSIGN);
			try {
				initializer = VariableInitializer();
			} catch (ParseException e) {
			errorMessage = "Literal expression expected in variable initializer";
			errorLevel   = ERROR;
			errorStart = assignToken.sourceEnd +1;
			errorEnd   = assignToken.sourceEnd +1;
			processParseExceptionDebug(e);
			}
			break;
		default:
			jj_la1[11] = jj_gen;
			;
		}
	if (initializer == null) {
		{if (true) return new VariableDeclaration(currentSegment,
																	 variable,
																	 variable.sourceStart,
																	 variable.sourceEnd);}
	}
	{if (true) return new VariableDeclaration(currentSegment,
																 variable,
																 initializer,
																 VariableDeclaration.EQUAL,
																 variable.sourceStart);}
		throw new Error("Missing return statement in function");
	}

/**
 * this will be used by static statement
 */
	final public VariableDeclaration VariableDeclarator() throws ParseException {
	final AbstractVariable variable;
	Expression initializer = null;
	final Token token;
		variable = VariableDeclaratorId();
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ASSIGN:
			token = jj_consume_token(ASSIGN);
			try {
				initializer = VariableInitializer();
			} catch (ParseException e) {
			errorMessage = "Literal expression expected in variable initializer";
			errorLevel   = ERROR;
			errorStart = token.sourceEnd+1;
			errorEnd   = token.sourceEnd+1;
			processParseExceptionDebug(e);
			}
			break;
		default:
			jj_la1[12] = jj_gen;
			;
		}
	if (initializer == null) {
		{if (true) return new VariableDeclaration(currentSegment,
																	 variable,
																	 variable.sourceStart,
																	 variable.sourceEnd);}
	}
		{if (true) return new VariableDeclaration(currentSegment,
																	 variable,
																	 initializer,
																	 VariableDeclaration.EQUAL,
																	 variable.sourceStart);}
		throw new Error("Missing return statement in function");
	}

/**
 * A Variable name.
 * @return the variable name (with suffix)
 */
	final public AbstractVariable VariableDeclaratorId() throws ParseException {
	AbstractVariable var;
		try {
			var = Variable();
			label_5:
			while (true) {
				if (jj_2_1(2)) {
					;
				} else {
					break label_5;
				}
				var = VariableSuffix(var);
			}
		 {if (true) return var;}
		} catch (ParseException e) {
		errorMessage = "'$' expected for variable identifier";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		{if (true) throw e;}
		}
		throw new Error("Missing return statement in function");
	}

	final public Variable Variable() throws ParseException {
	Variable variable = null;
	final Token token;
		token = jj_consume_token(DOLLAR);
		variable = Var();
		{if (true) return variable;}
		throw new Error("Missing return statement in function");
	}

	final public Variable Var() throws ParseException {
	Variable variable = null;
	final Token token,token2;
	ConstantIdentifier constant;
	Expression expression;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case DOLLAR:
			token = jj_consume_token(DOLLAR);
			variable = Var();
	 {if (true) return new Variable(variable,variable.sourceStart,variable.sourceEnd);}
			break;
		case LBRACE:
			token = jj_consume_token(LBRACE);
			expression = Expression();
			token2 = jj_consume_token(RBRACE);
	 {if (true) return new Variable(expression,
											 token.sourceStart,
											 token2.sourceEnd);}
			break;
		case IDENTIFIER:
			token = jj_consume_token(IDENTIFIER);
	 outlineInfo.addVariable('$' + token.image);
	 {if (true) return new Variable(token.image,token.sourceStart,token.sourceEnd);}
			break;
		default:
			jj_la1[13] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public Expression VariableInitializer() throws ParseException {
	final Expression expr;
	final Token token, token2;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case NULL:
		case TRUE:
		case FALSE:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
			expr = Literal();
	 {if (true) return expr;}
			break;
		case MINUS:
			token2 = jj_consume_token(MINUS);
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case INTEGER_LITERAL:
				token = jj_consume_token(INTEGER_LITERAL);
				break;
			case FLOATING_POINT_LITERAL:
				token = jj_consume_token(FLOATING_POINT_LITERAL);
				break;
			default:
				jj_la1[14] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
	 {if (true) return new PrefixedUnaryExpression(new NumberLiteral(token),
																			OperatorIds.MINUS,
																			token2.sourceStart);}
			break;
		case PLUS:
			token2 = jj_consume_token(PLUS);
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case INTEGER_LITERAL:
				token = jj_consume_token(INTEGER_LITERAL);
				break;
			case FLOATING_POINT_LITERAL:
				token = jj_consume_token(FLOATING_POINT_LITERAL);
				break;
			default:
				jj_la1[15] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
	 {if (true) return new PrefixedUnaryExpression(new NumberLiteral(token),
																			OperatorIds.PLUS,
																			token2.sourceStart);}
			break;
		case ARRAY:
			expr = ArrayDeclarator();
	 {if (true) return expr;}
			break;
		case IDENTIFIER:
			token = jj_consume_token(IDENTIFIER);
	 {if (true) return new ConstantIdentifier(token);}
			break;
		default:
			jj_la1[16] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public ArrayVariableDeclaration ArrayVariable() throws ParseException {
final Expression expr,expr2;
		expr = Expression();
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ARRAYASSIGN:
			jj_consume_token(ARRAYASSIGN);
			expr2 = Expression();
		 {if (true) return new ArrayVariableDeclaration(expr,expr2);}
			break;
		default:
			jj_la1[17] = jj_gen;
			;
		}
	 {if (true) return new ArrayVariableDeclaration(expr,jj_input_stream.getPosition());}
		throw new Error("Missing return statement in function");
	}

	final public ArrayVariableDeclaration[] ArrayInitializer() throws ParseException {
	ArrayVariableDeclaration expr;
	final ArrayList list = new ArrayList();
		jj_consume_token(LPAREN);
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ARRAY:
		case LIST:
		case PRINT:
		case NEW:
		case NULL:
		case TRUE:
		case FALSE:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
			expr = ArrayVariable();
			 list.add(expr);
			label_6:
			while (true) {
				if (jj_2_2(2)) {
					;
				} else {
					break label_6;
				}
				jj_consume_token(COMMA);
				expr = ArrayVariable();
			 list.add(expr);
			}
			break;
		default:
			jj_la1[18] = jj_gen;
			;
		}
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case COMMA:
			jj_consume_token(COMMA);
							 list.add(null);
			break;
		default:
			jj_la1[19] = jj_gen;
			;
		}
		jj_consume_token(RPAREN);
	final ArrayVariableDeclaration[] vars = new ArrayVariableDeclaration[list.size()];
	list.toArray(vars);
	{if (true) return vars;}
		throw new Error("Missing return statement in function");
	}

/**
 * A Method Declaration.
 * <b>function</b> MetodDeclarator() Block()
 */
	final public MethodDeclaration MethodDeclaration() throws ParseException {
	final MethodDeclaration functionDeclaration;
	final Block block;
	final OutlineableWithChildren seg = currentSegment;
	final Token token;
		token = jj_consume_token(FUNCTION);
		try {
			functionDeclaration = MethodDeclarator(token.sourceStart);
		 outlineInfo.addVariable(functionDeclaration.name);
		} catch (ParseException e) {
		if (errorMessage != null)  {if (true) throw e;}
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', function identifier expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		{if (true) throw e;}
		}
	 currentSegment = functionDeclaration;
		block = Block();
	 functionDeclaration.statements = block.statements;
	 currentSegment = seg;
	 {if (true) return functionDeclaration;}
		throw new Error("Missing return statement in function");
	}

/**
 * A MethodDeclarator.
 * [&] IDENTIFIER(parameters ...).
 * @return a function description for the outline
 */
	final public MethodDeclaration MethodDeclarator(final int start) throws ParseException {
	Token identifier = null;
	Token reference = null;
	final ArrayList formalParameters = new ArrayList();
	String identifierChar = SYNTAX_ERROR_CHAR;
	int end = start;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case BIT_AND:
			reference = jj_consume_token(BIT_AND);
													end = reference.sourceEnd;
			break;
		default:
			jj_la1[20] = jj_gen;
			;
		}
		try {
			identifier = jj_consume_token(IDENTIFIER);
			identifierChar = identifier.image;
			end = identifier.sourceEnd;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', function identifier expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceEnd;
		errorEnd   = e.currentToken.next.sourceStart;
		processParseExceptionDebug(e);
		}
		end = FormalParameters(formalParameters);
	int nameStart, nameEnd;
	if (identifier == null) {
		if (reference == null) {
			nameStart = start + 9;
			nameEnd = start + 10;
		} else {
			nameStart = reference.sourceEnd + 1;
			nameEnd = reference.sourceEnd + 2;
		}
	} else {
			nameStart = identifier.sourceStart;
			nameEnd = identifier.sourceEnd;
	}
	{if (true) return new MethodDeclaration(currentSegment,
															 identifierChar,
															 formalParameters,
															 reference != null,
															 nameStart,
															 nameEnd,
															 start,
															 end);}
		throw new Error("Missing return statement in function");
	}

/**
 * FormalParameters follows method identifier.
 * (FormalParameter())
 */
	final public int FormalParameters(final ArrayList parameters) throws ParseException {
	VariableDeclaration var;
	final Token token;
	Token tok = this.token;
	int end = tok.sourceEnd;
		try {
			tok = jj_consume_token(LPAREN);
	 end = tok.sourceEnd;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', '(' expected after function identifier";
		errorLevel   = ERROR;
		errorStart = e.currentToken.next.sourceStart;
		errorEnd   = e.currentToken.next.sourceEnd;
		processParseExceptionDebug(e);
		}
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case BIT_AND:
		case DOLLAR:
			var = FormalParameter();
		 parameters.add(var);end = var.sourceEnd;
			label_7:
			while (true) {
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case COMMA:
					;
					break;
				default:
					jj_la1[21] = jj_gen;
					break label_7;
				}
				jj_consume_token(COMMA);
				var = FormalParameter();
			 parameters.add(var);end = var.sourceEnd;
			}
			break;
		default:
			jj_la1[22] = jj_gen;
			;
		}
		try {
			token = jj_consume_token(RPAREN);
		 end = token.sourceEnd;
		} catch (ParseException e) {
		errorMessage = "')' expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.next.sourceStart;
		errorEnd   = e.currentToken.next.sourceEnd;
		processParseExceptionDebug(e);
		}
	{if (true) return end;}
		throw new Error("Missing return statement in function");
	}

/**
 * A formal parameter.
 * $varname[=value] (,$varname[=value])
 */
	final public VariableDeclaration FormalParameter() throws ParseException {
	final VariableDeclaration variableDeclaration;
	Token token = null;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case BIT_AND:
			token = jj_consume_token(BIT_AND);
			break;
		default:
			jj_la1[23] = jj_gen;
			;
		}
		variableDeclaration = VariableDeclaratorNoSuffix();
		outlineInfo.addVariable('$'+variableDeclaration.name());
		if (token != null) {
			variableDeclaration.setReference(true);
		}
		{if (true) return variableDeclaration;}
		throw new Error("Missing return statement in function");
	}

	final public ConstantIdentifier Type() throws ParseException {
 final Token token;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case STRING:
			token = jj_consume_token(STRING);
											 {if (true) return new ConstantIdentifier(token);}
			break;
		case BOOL:
			token = jj_consume_token(BOOL);
											 {if (true) return new ConstantIdentifier(token);}
			break;
		case BOOLEAN:
			token = jj_consume_token(BOOLEAN);
											 {if (true) return new ConstantIdentifier(token);}
			break;
		case REAL:
			token = jj_consume_token(REAL);
											 {if (true) return new ConstantIdentifier(token);}
			break;
		case DOUBLE:
			token = jj_consume_token(DOUBLE);
											 {if (true) return new ConstantIdentifier(token);}
			break;
		case FLOAT:
			token = jj_consume_token(FLOAT);
											 {if (true) return new ConstantIdentifier(token);}
			break;
		case INT:
			token = jj_consume_token(INT);
											 {if (true) return new ConstantIdentifier(token);}
			break;
		case INTEGER:
			token = jj_consume_token(INTEGER);
											 {if (true) return new ConstantIdentifier(token);}
			break;
		case OBJECT:
			token = jj_consume_token(OBJECT);
											 {if (true) return new ConstantIdentifier(token);}
			break;
		default:
			jj_la1[24] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public Expression Expression() throws ParseException {
	final Expression expr;
	Expression initializer = null;
	int assignOperator = -1;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ARRAY:
		case NEW:
		case NULL:
		case TRUE:
		case FALSE:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
			expr = ConditionalExpression();
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case ASSIGN:
			case PLUSASSIGN:
			case MINUSASSIGN:
			case STARASSIGN:
			case SLASHASSIGN:
			case ANDASSIGN:
			case ORASSIGN:
			case XORASSIGN:
			case DOTASSIGN:
			case REMASSIGN:
			case TILDEEQUAL:
			case LSHIFTASSIGN:
			case RSIGNEDSHIFTASSIGN:
				assignOperator = AssignmentOperator();
				try {
					initializer = Expression();
				} catch (ParseException e) {
			if (errorMessage != null) {
				{if (true) throw e;}
			}
			errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', expression expected";
			errorLevel   = ERROR;
			errorEnd   = jj_input_stream.getPosition();
			{if (true) throw e;}
				}
				break;
			default:
				jj_la1[25] = jj_gen;
				;
			}
		if (assignOperator != -1) {// todo : change this, very very bad :(
				if (expr instanceof AbstractVariable) {
					{if (true) return new VariableDeclaration(currentSegment,
																				 (AbstractVariable) expr,
																				 initializer,
																				 expr.sourceStart,
																				 initializer.sourceEnd);}
				}
				String varName = expr.toStringExpression().substring(1);
				{if (true) return new VariableDeclaration(currentSegment,
																			 new Variable(varName,
																										expr.sourceStart,
																										expr.sourceEnd),
																			 expr.sourceStart,
																			 initializer.sourceEnd);}
		}
		{if (true) return expr;}
			break;
		case LIST:
		case PRINT:
			expr = ExpressionWBang();
																	{if (true) return expr;}
			break;
		default:
			jj_la1[26] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public Expression ExpressionWBang() throws ParseException {
	final Expression expr;
	final Token token;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case BANG:
			token = jj_consume_token(BANG);
			expr = ExpressionWBang();
	 {if (true) return new PrefixedUnaryExpression(expr,OperatorIds.NOT,token.sourceStart);}
			break;
		case LIST:
		case PRINT:
			expr = ExpressionNoBang();
														 {if (true) return expr;}
			break;
		default:
			jj_la1[27] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public Expression ExpressionNoBang() throws ParseException {
	Expression expr;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case LIST:
			expr = ListExpression();
															{if (true) return expr;}
			break;
		case PRINT:
			expr = PrintExpression();
															{if (true) return expr;}
			break;
		default:
			jj_la1[28] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

/**
 * Any assignement operator.
 * @return the assignement operator id
 */
	final public int AssignmentOperator() throws ParseException {
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ASSIGN:
			jj_consume_token(ASSIGN);
												{if (true) return VariableDeclaration.EQUAL;}
			break;
		case STARASSIGN:
			jj_consume_token(STARASSIGN);
												{if (true) return VariableDeclaration.STAR_EQUAL;}
			break;
		case SLASHASSIGN:
			jj_consume_token(SLASHASSIGN);
												{if (true) return VariableDeclaration.SLASH_EQUAL;}
			break;
		case REMASSIGN:
			jj_consume_token(REMASSIGN);
												{if (true) return VariableDeclaration.REM_EQUAL;}
			break;
		case PLUSASSIGN:
			jj_consume_token(PLUSASSIGN);
												{if (true) return VariableDeclaration.PLUS_EQUAL;}
			break;
		case MINUSASSIGN:
			jj_consume_token(MINUSASSIGN);
												{if (true) return VariableDeclaration.MINUS_EQUAL;}
			break;
		case LSHIFTASSIGN:
			jj_consume_token(LSHIFTASSIGN);
												{if (true) return VariableDeclaration.LSHIFT_EQUAL;}
			break;
		case RSIGNEDSHIFTASSIGN:
			jj_consume_token(RSIGNEDSHIFTASSIGN);
												{if (true) return VariableDeclaration.RSIGNEDSHIFT_EQUAL;}
			break;
		case ANDASSIGN:
			jj_consume_token(ANDASSIGN);
												{if (true) return VariableDeclaration.AND_EQUAL;}
			break;
		case XORASSIGN:
			jj_consume_token(XORASSIGN);
												{if (true) return VariableDeclaration.XOR_EQUAL;}
			break;
		case ORASSIGN:
			jj_consume_token(ORASSIGN);
												{if (true) return VariableDeclaration.OR_EQUAL;}
			break;
		case DOTASSIGN:
			jj_consume_token(DOTASSIGN);
												{if (true) return VariableDeclaration.DOT_EQUAL;}
			break;
		case TILDEEQUAL:
			jj_consume_token(TILDEEQUAL);
												{if (true) return VariableDeclaration.TILDE_EQUAL;}
			break;
		default:
			jj_la1[29] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public Expression ConditionalExpression() throws ParseException {
	final Expression expr;
	Expression expr2 = null;
	Expression expr3 = null;
		expr = ConditionalOrExpression();
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case HOOK:
			jj_consume_token(HOOK);
			expr2 = Expression();
			jj_consume_token(COLON);
			expr3 = ConditionalExpression();
			break;
		default:
			jj_la1[30] = jj_gen;
			;
		}
	if (expr3 == null) {
		{if (true) return expr;}
	}
	{if (true) return new ConditionalExpression(expr,expr2,expr3);}
		throw new Error("Missing return statement in function");
	}

	final public Expression ConditionalOrExpression() throws ParseException {
	Expression expr,expr2;
	int operator;
		expr = ConditionalAndExpression();
		label_8:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case OR_OR:
			case _ORL:
				;
				break;
			default:
				jj_la1[31] = jj_gen;
				break label_8;
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case OR_OR:
				jj_consume_token(OR_OR);
								 operator = OperatorIds.OR_OR;
				break;
			case _ORL:
				jj_consume_token(_ORL);
								 operator = OperatorIds.ORL;
				break;
			default:
				jj_la1[32] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
			expr2 = ConditionalAndExpression();
			expr = new BinaryExpression(expr,expr2,operator);
		}
	 {if (true) return expr;}
		throw new Error("Missing return statement in function");
	}

	final public Expression ConditionalAndExpression() throws ParseException {
	Expression expr,expr2;
	int operator;
		expr = ConcatExpression();
		label_9:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case AND_AND:
			case _ANDL:
				;
				break;
			default:
				jj_la1[33] = jj_gen;
				break label_9;
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case AND_AND:
				jj_consume_token(AND_AND);
								operator = OperatorIds.AND_AND;
				break;
			case _ANDL:
				jj_consume_token(_ANDL);
								operator = OperatorIds.ANDL;
				break;
			default:
				jj_la1[34] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
			expr2 = ConcatExpression();
															 expr = new BinaryExpression(expr,expr2,operator);
		}
	 {if (true) return expr;}
		throw new Error("Missing return statement in function");
	}

	final public Expression ConcatExpression() throws ParseException {
	Expression expr,expr2;
		expr = InclusiveOrExpression();
		label_10:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case DOT:
				;
				break;
			default:
				jj_la1[35] = jj_gen;
				break label_10;
			}
			jj_consume_token(DOT);
			expr2 = InclusiveOrExpression();
		 expr = new BinaryExpression(expr,expr2,OperatorIds.DOT);
		}
	 {if (true) return expr;}
		throw new Error("Missing return statement in function");
	}

	final public Expression InclusiveOrExpression() throws ParseException {
	Expression expr,expr2;
		expr = ExclusiveOrExpression();
		label_11:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case BIT_OR:
				;
				break;
			default:
				jj_la1[36] = jj_gen;
				break label_11;
			}
			jj_consume_token(BIT_OR);
			expr2 = ExclusiveOrExpression();
		expr = new BinaryExpression(expr,expr2,OperatorIds.OR);
		}
	 {if (true) return expr;}
		throw new Error("Missing return statement in function");
	}

	final public Expression ExclusiveOrExpression() throws ParseException {
	Expression expr,expr2;
		expr = AndExpression();
		label_12:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case XOR:
				;
				break;
			default:
				jj_la1[37] = jj_gen;
				break label_12;
			}
			jj_consume_token(XOR);
			expr2 = AndExpression();
		 expr = new BinaryExpression(expr,expr2,OperatorIds.XOR);
		}
	 {if (true) return expr;}
		throw new Error("Missing return statement in function");
	}

	final public Expression AndExpression() throws ParseException {
	Expression expr,expr2;
		expr = EqualityExpression();
		label_13:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case BIT_AND:
				;
				break;
			default:
				jj_la1[38] = jj_gen;
				break label_13;
			}
			jj_consume_token(BIT_AND);
			expr2 = EqualityExpression();
		 expr = new BinaryExpression(expr,expr2,OperatorIds.AND);
		}
	 {if (true) return expr;}
		throw new Error("Missing return statement in function");
	}

	final public Expression EqualityExpression() throws ParseException {
	Expression expr,expr2;
	int operator;
	Token token;
		expr = RelationalExpression();
		label_14:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case EQUAL_EQUAL:
			case NOT_EQUAL:
			case DIF:
			case BANGDOUBLEEQUAL:
			case TRIPLEEQUAL:
				;
				break;
			default:
				jj_la1[39] = jj_gen;
				break label_14;
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case EQUAL_EQUAL:
				token = jj_consume_token(EQUAL_EQUAL);
																	operator = OperatorIds.EQUAL_EQUAL;
				break;
			case DIF:
				token = jj_consume_token(DIF);
																	operator = OperatorIds.DIF;
				break;
			case NOT_EQUAL:
				token = jj_consume_token(NOT_EQUAL);
																	operator = OperatorIds.DIF;
				break;
			case BANGDOUBLEEQUAL:
				token = jj_consume_token(BANGDOUBLEEQUAL);
																	operator = OperatorIds.BANG_EQUAL_EQUAL;
				break;
			case TRIPLEEQUAL:
				token = jj_consume_token(TRIPLEEQUAL);
																	operator = OperatorIds.EQUAL_EQUAL_EQUAL;
				break;
			default:
				jj_la1[40] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
			try {
				expr2 = RelationalExpression();
			} catch (ParseException e) {
		if (errorMessage != null) {
			{if (true) throw e;}
		}
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', expression expected";
		errorLevel   = ERROR;
		errorStart = token.sourceEnd +1;
		errorEnd   = token.sourceEnd +1;
		expr2 = new ConstantIdentifier(SYNTAX_ERROR_CHAR,token.sourceEnd +1,token.sourceEnd +1);
		processParseExceptionDebug(e);
			}
		expr = new BinaryExpression(expr,expr2,operator);
		}
	 {if (true) return expr;}
		throw new Error("Missing return statement in function");
	}

	final public Expression RelationalExpression() throws ParseException {
	Expression expr,expr2;
	int operator;
		expr = ShiftExpression();
		label_15:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case GT:
			case LT:
			case LE:
			case GE:
				;
				break;
			default:
				jj_la1[41] = jj_gen;
				break label_15;
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case LT:
				jj_consume_token(LT);
					operator = OperatorIds.LESS;
				break;
			case GT:
				jj_consume_token(GT);
					operator = OperatorIds.GREATER;
				break;
			case LE:
				jj_consume_token(LE);
					operator = OperatorIds.LESS_EQUAL;
				break;
			case GE:
				jj_consume_token(GE);
					operator = OperatorIds.GREATER_EQUAL;
				break;
			default:
				jj_la1[42] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
			expr2 = ShiftExpression();
	 expr = new BinaryExpression(expr,expr2,operator);
		}
	 {if (true) return expr;}
		throw new Error("Missing return statement in function");
	}

	final public Expression ShiftExpression() throws ParseException {
	Expression expr,expr2;
	int operator;
		expr = AdditiveExpression();
		label_16:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case LSHIFT:
			case RSIGNEDSHIFT:
			case RUNSIGNEDSHIFT:
				;
				break;
			default:
				jj_la1[43] = jj_gen;
				break label_16;
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case LSHIFT:
				jj_consume_token(LSHIFT);
											operator = OperatorIds.LEFT_SHIFT;
				break;
			case RSIGNEDSHIFT:
				jj_consume_token(RSIGNEDSHIFT);
											operator = OperatorIds.RIGHT_SHIFT;
				break;
			case RUNSIGNEDSHIFT:
				jj_consume_token(RUNSIGNEDSHIFT);
											operator = OperatorIds.UNSIGNED_RIGHT_SHIFT;
				break;
			default:
				jj_la1[44] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
			expr2 = AdditiveExpression();
	 expr = new BinaryExpression(expr,expr2,operator);
		}
	 {if (true) return expr;}
		throw new Error("Missing return statement in function");
	}

	final public Expression AdditiveExpression() throws ParseException {
	Expression expr,expr2;
	int operator;
		expr = MultiplicativeExpression();
		label_17:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case PLUS:
			case MINUS:
				;
				break;
			default:
				jj_la1[45] = jj_gen;
				break label_17;
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case PLUS:
				jj_consume_token(PLUS);
								operator = OperatorIds.PLUS;
				break;
			case MINUS:
				jj_consume_token(MINUS);
								operator = OperatorIds.MINUS;
				break;
			default:
				jj_la1[46] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
			expr2 = MultiplicativeExpression();
	 expr = new BinaryExpression(expr,expr2,operator);
		}
	 {if (true) return expr;}
		throw new Error("Missing return statement in function");
	}

	final public Expression MultiplicativeExpression() throws ParseException {
	Expression expr,expr2;
	int operator;
		try {
			expr = UnaryExpression();
		} catch (ParseException e) {
		if (errorMessage != null) {if (true) throw e;}
		errorMessage = "unexpected token '"+e.currentToken.next.image+'\'';
		errorLevel   = ERROR;
		errorStart = this.token.sourceStart;
		errorEnd   = this.token.sourceEnd;
		{if (true) throw e;}
		}
		label_18:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case STAR:
			case SLASH:
			case REMAINDER:
				;
				break;
			default:
				jj_la1[47] = jj_gen;
				break label_18;
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case STAR:
				jj_consume_token(STAR);
									 operator = OperatorIds.MULTIPLY;
				break;
			case SLASH:
				jj_consume_token(SLASH);
									 operator = OperatorIds.DIVIDE;
				break;
			case REMAINDER:
				jj_consume_token(REMAINDER);
									 operator = OperatorIds.REMAINDER;
				break;
			default:
				jj_la1[48] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
			expr2 = UnaryExpression();
		 expr = new BinaryExpression(expr,expr2,operator);
		}
	 {if (true) return expr;}
		throw new Error("Missing return statement in function");
	}

/**
 * An unary expression starting with @, & or nothing
 */
	final public Expression UnaryExpression() throws ParseException {
	final Expression expr;
		/* <BIT_AND> expr = UnaryExpressionNoPrefix()             //why did I had that ?
			{return new PrefixedUnaryExpression(expr,OperatorIds.AND,pos);}
		|      */
			expr = AtNotTildeUnaryExpression();
																			{if (true) return expr;}
		throw new Error("Missing return statement in function");
	}

	final public Expression AtNotTildeUnaryExpression() throws ParseException {
	final Expression expr;
	final Token token;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case AT:
			token = jj_consume_token(AT);
			expr = AtNotTildeUnaryExpression();
	 {if (true) return new PrefixedUnaryExpression(expr,OperatorIds.AT,token.sourceStart);}
			break;
		case TILDE:
			token = jj_consume_token(TILDE);
			expr = AtNotTildeUnaryExpression();
	 {if (true) return new PrefixedUnaryExpression(expr,OperatorIds.TWIDDLE,token.sourceStart);}
			break;
		case BANG:
			token = jj_consume_token(BANG);
			expr = AtNotUnaryExpression();
	 {if (true) return new PrefixedUnaryExpression(expr,OperatorIds.NOT,token.sourceStart);}
			break;
		case ARRAY:
		case NEW:
		case NULL:
		case TRUE:
		case FALSE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
			expr = UnaryExpressionNoPrefix();
	 {if (true) return expr;}
			break;
		default:
			jj_la1[49] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

/**
 * An expression prefixed (or not) by one or more @ and !.
 * @return the expression
 */
	final public Expression AtNotUnaryExpression() throws ParseException {
	final Expression expr;
	final Token token;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case AT:
			token = jj_consume_token(AT);
			expr = AtNotUnaryExpression();
	 {if (true) return new PrefixedUnaryExpression(expr,OperatorIds.AT,token.sourceStart);}
			break;
		case BANG:
			token = jj_consume_token(BANG);
			expr = AtNotUnaryExpression();
	 {if (true) return new PrefixedUnaryExpression(expr,OperatorIds.NOT,token.sourceStart);}
			break;
		case ARRAY:
		case NEW:
		case NULL:
		case TRUE:
		case FALSE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
			expr = UnaryExpressionNoPrefix();
	 {if (true) return expr;}
			break;
		default:
			jj_la1[50] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public Expression UnaryExpressionNoPrefix() throws ParseException {
	final Expression expr;
	final Token token;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case PLUS:
			token = jj_consume_token(PLUS);
			expr = AtNotTildeUnaryExpression();
																											 {if (true) return new PrefixedUnaryExpression(expr,
																																										 OperatorIds.PLUS,
																																										 token.sourceStart);}
			break;
		case MINUS:
			token = jj_consume_token(MINUS);
			expr = AtNotTildeUnaryExpression();
																											 {if (true) return new PrefixedUnaryExpression(expr,
																																										 OperatorIds.MINUS,
																																										 token.sourceStart);}
			break;
		case PLUS_PLUS:
		case MINUS_MINUS:
			expr = PreIncDecExpression();
	 {if (true) return expr;}
			break;
		case ARRAY:
		case NEW:
		case NULL:
		case TRUE:
		case FALSE:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
			expr = UnaryExpressionNotPlusMinus();
	 {if (true) return expr;}
			break;
		default:
			jj_la1[51] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public Expression PreIncDecExpression() throws ParseException {
final Expression expr;
final int operator;
final Token token;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case PLUS_PLUS:
			token = jj_consume_token(PLUS_PLUS);
														 operator = OperatorIds.PLUS_PLUS;
			break;
		case MINUS_MINUS:
			token = jj_consume_token(MINUS_MINUS);
														 operator = OperatorIds.MINUS_MINUS;
			break;
		default:
			jj_la1[52] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		expr = PrimaryExpression();
	 {if (true) return new PrefixedUnaryExpression(expr,operator,token.sourceStart);}
		throw new Error("Missing return statement in function");
	}

	final public Expression UnaryExpressionNotPlusMinus() throws ParseException {
	final Expression expr;
		if (jj_2_3(2147483647)) {
			expr = CastExpression();
																	 {if (true) return expr;}
		} else {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case ARRAY:
			case NEW:
			case BIT_AND:
			case DOLLAR:
			case IDENTIFIER:
				expr = PostfixExpression();
																	 {if (true) return expr;}
				break;
			case NULL:
			case TRUE:
			case FALSE:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
				expr = Literal();
																	 {if (true) return expr;}
				break;
			case LPAREN:
				jj_consume_token(LPAREN);
				expr = Expression();
				try {
					jj_consume_token(RPAREN);
				} catch (ParseException e) {
		errorMessage = "')' expected";
		errorLevel   = ERROR;
		errorStart   = expr.sourceEnd +1;
		errorEnd     = expr.sourceEnd +1;
		processParseExceptionDebug(e);
				}
	 {if (true) return expr;}
				break;
			default:
				jj_la1[53] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
		}
		throw new Error("Missing return statement in function");
	}

	final public CastExpression CastExpression() throws ParseException {
final ConstantIdentifier type;
final Expression expr;
final Token token,token1;
		token1 = jj_consume_token(LPAREN);
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case STRING:
		case OBJECT:
		case BOOL:
		case BOOLEAN:
		case REAL:
		case DOUBLE:
		case FLOAT:
		case INT:
		case INTEGER:
			type = Type();
			break;
		case ARRAY:
			token = jj_consume_token(ARRAY);
											 type = new ConstantIdentifier(token);
			break;
		default:
			jj_la1[54] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		jj_consume_token(RPAREN);
		expr = UnaryExpression();
	 {if (true) return new CastExpression(type,expr,token1.sourceStart,expr.sourceEnd);}
		throw new Error("Missing return statement in function");
	}

	final public Expression PostfixExpression() throws ParseException {
	final Expression expr;
	int operator = -1;
	Token token = null;
		expr = PrimaryExpression();
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case PLUS_PLUS:
		case MINUS_MINUS:
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case PLUS_PLUS:
				token = jj_consume_token(PLUS_PLUS);
														 operator = OperatorIds.PLUS_PLUS;
				break;
			case MINUS_MINUS:
				token = jj_consume_token(MINUS_MINUS);
														 operator = OperatorIds.MINUS_MINUS;
				break;
			default:
				jj_la1[55] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
			break;
		default:
			jj_la1[56] = jj_gen;
			;
		}
		if (operator == -1) {
			{if (true) return expr;}
		}
		{if (true) return new PostfixedUnaryExpression(expr,operator,token.sourceEnd);}
		throw new Error("Missing return statement in function");
	}

	final public Expression PrimaryExpression() throws ParseException {
	Expression expr;
	Token token = null;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case NEW:
		case BIT_AND:
		case DOLLAR:
		case IDENTIFIER:
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case BIT_AND:
				token = jj_consume_token(BIT_AND);
				break;
			default:
				jj_la1[57] = jj_gen;
				;
			}
			expr = refPrimaryExpression(token);
	 {if (true) return expr;}
			break;
		case ARRAY:
			expr = ArrayDeclarator();
	 {if (true) return expr;}
			break;
		default:
			jj_la1[58] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public Expression refPrimaryExpression(final Token reference) throws ParseException {
	Expression expr;
	Expression expr2 = null;
	final Token identifier;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case IDENTIFIER:
			identifier = jj_consume_token(IDENTIFIER);
		expr = new ConstantIdentifier(identifier);
			label_19:
			while (true) {
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case STATICCLASSACCESS:
					;
					break;
				default:
					jj_la1[59] = jj_gen;
					break label_19;
				}
				jj_consume_token(STATICCLASSACCESS);
				expr2 = ClassIdentifier();
		 expr = new ClassAccess(expr,
														expr2,
														ClassAccess.STATIC);
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case LPAREN:
				expr2 = Arguments(expr);
				break;
			default:
				jj_la1[60] = jj_gen;
				;
			}
		if (expr2 == null) {
			if (reference != null) {
				ParseException e = generateParseException();
				errorMessage = "you cannot use a constant by reference";
				errorLevel   = ERROR;
				errorStart   = reference.sourceStart;
				errorEnd     = reference.sourceEnd;
				processParseExceptionDebug(e);
			}
			{if (true) return expr;}
		}
		{if (true) return expr2;}
			break;
		case DOLLAR:
			expr = VariableDeclaratorId();
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case LPAREN:
				expr = Arguments(expr);
				break;
			default:
				jj_la1[61] = jj_gen;
				;
			}
	 {if (true) return expr;}
			break;
		case NEW:
			token = jj_consume_token(NEW);
			expr = ClassIdentifier();
		int start;
		if (reference == null) {
			start = token.sourceStart;
		} else {
			start = reference.sourceStart;
		}
		expr = new ClassInstantiation(expr,
																	reference != null,
																	start);
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case LPAREN:
				expr = Arguments(expr);
				break;
			default:
				jj_la1[62] = jj_gen;
				;
			}
	 {if (true) return expr;}
			break;
		default:
			jj_la1[63] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

/**
 * An array declarator.
 * array(vars)
 * @return an array
 */
	final public ArrayInitializer ArrayDeclarator() throws ParseException {
	final ArrayVariableDeclaration[] vars;
	final Token token;
		token = jj_consume_token(ARRAY);
		vars = ArrayInitializer();
	 {if (true) return new ArrayInitializer(vars,
															 token.sourceStart,
															 this.token.sourceEnd);}
		throw new Error("Missing return statement in function");
	}

	final public Expression ClassIdentifier() throws ParseException {
	final Expression expr;
	final Token token;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case IDENTIFIER:
			token = jj_consume_token(IDENTIFIER);
																 {if (true) return new ConstantIdentifier(token);}
			break;
		case STRING:
		case OBJECT:
		case BOOL:
		case BOOLEAN:
		case REAL:
		case DOUBLE:
		case FLOAT:
		case INT:
		case INTEGER:
			expr = Type();
																 {if (true) return expr;}
			break;
		case DOLLAR:
			expr = VariableDeclaratorId();
																 {if (true) return expr;}
			break;
		default:
			jj_la1[64] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

/**
 * Used by Variabledeclaratorid and primarysuffix
 */
	final public AbstractVariable VariableSuffix(final AbstractVariable prefix) throws ParseException {
	Expression expression = null;
	final Token classAccessToken,lbrace,rbrace;
	Token token;
	int pos;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case CLASSACCESS:
			classAccessToken = jj_consume_token(CLASSACCESS);
			try {
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case LBRACE:
					lbrace = jj_consume_token(LBRACE);
					expression = Expression();
					rbrace = jj_consume_token(RBRACE);
								 expression = new Variable(expression,
																					 lbrace.sourceStart,
																					 rbrace.sourceEnd);
					break;
				case IDENTIFIER:
					token = jj_consume_token(IDENTIFIER);
				 expression = new ConstantIdentifier(token.image,token.sourceStart,token.sourceEnd);
					break;
				case DOLLAR:
					expression = Variable();
					break;
				default:
					jj_la1[65] = jj_gen;
					jj_consume_token(-1);
					throw new ParseException();
				}
			} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', function call or field access expected";
		errorLevel   = ERROR;
		errorStart = classAccessToken.sourceEnd +1;
		errorEnd   = classAccessToken.sourceEnd +1;
		processParseExceptionDebug(e);
			}
	 {if (true) return new ClassAccess(prefix,
													expression,
													ClassAccess.NORMAL);}
			break;
		case LBRACKET:
			token = jj_consume_token(LBRACKET);
											pos = token.sourceEnd+1;
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case ARRAY:
			case LIST:
			case PRINT:
			case NEW:
			case NULL:
			case TRUE:
			case FALSE:
			case STRING:
			case OBJECT:
			case BOOL:
			case BOOLEAN:
			case REAL:
			case DOUBLE:
			case FLOAT:
			case INT:
			case INTEGER:
			case AT:
			case BANG:
			case TILDE:
			case PLUS_PLUS:
			case MINUS_MINUS:
			case PLUS:
			case MINUS:
			case BIT_AND:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
			case DOLLAR:
			case IDENTIFIER:
			case LPAREN:
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case ARRAY:
				case LIST:
				case PRINT:
				case NEW:
				case NULL:
				case TRUE:
				case FALSE:
				case AT:
				case BANG:
				case TILDE:
				case PLUS_PLUS:
				case MINUS_MINUS:
				case PLUS:
				case MINUS:
				case BIT_AND:
				case INTEGER_LITERAL:
				case FLOATING_POINT_LITERAL:
				case STRING_LITERAL:
				case DOUBLEQUOTE:
				case DOLLAR:
				case IDENTIFIER:
				case LPAREN:
					expression = Expression();
																pos = expression.sourceEnd+1;
					break;
				case STRING:
				case OBJECT:
				case BOOL:
				case BOOLEAN:
				case REAL:
				case DOUBLE:
				case FLOAT:
				case INT:
				case INTEGER:
					expression = Type();
																pos = expression.sourceEnd+1;
					break;
				default:
					jj_la1[66] = jj_gen;
					jj_consume_token(-1);
					throw new ParseException();
				}
				break;
			default:
				jj_la1[67] = jj_gen;
				;
			}
			try {
				token = jj_consume_token(RBRACKET);
		 pos = token.sourceEnd;
			} catch (ParseException e) {
		errorMessage = "']' expected";
		errorLevel   = ERROR;
		errorStart = pos;
		errorEnd   = pos;
		processParseExceptionDebug(e);
			}
	 {if (true) return new ArrayDeclarator(prefix,expression,pos);}
			break;
		case LBRACE:
			token = jj_consume_token(LBRACE);
										pos = token.sourceEnd+1;
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case ARRAY:
			case LIST:
			case PRINT:
			case NEW:
			case NULL:
			case TRUE:
			case FALSE:
			case STRING:
			case OBJECT:
			case BOOL:
			case BOOLEAN:
			case REAL:
			case DOUBLE:
			case FLOAT:
			case INT:
			case INTEGER:
			case AT:
			case BANG:
			case TILDE:
			case PLUS_PLUS:
			case MINUS_MINUS:
			case PLUS:
			case MINUS:
			case BIT_AND:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
			case DOLLAR:
			case IDENTIFIER:
			case LPAREN:
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case ARRAY:
				case LIST:
				case PRINT:
				case NEW:
				case NULL:
				case TRUE:
				case FALSE:
				case AT:
				case BANG:
				case TILDE:
				case PLUS_PLUS:
				case MINUS_MINUS:
				case PLUS:
				case MINUS:
				case BIT_AND:
				case INTEGER_LITERAL:
				case FLOATING_POINT_LITERAL:
				case STRING_LITERAL:
				case DOUBLEQUOTE:
				case DOLLAR:
				case IDENTIFIER:
				case LPAREN:
					expression = Expression();
																pos = expression.sourceEnd+1;
					break;
				case STRING:
				case OBJECT:
				case BOOL:
				case BOOLEAN:
				case REAL:
				case DOUBLE:
				case FLOAT:
				case INT:
				case INTEGER:
					expression = Type();
																pos = expression.sourceEnd+1;
					break;
				default:
					jj_la1[68] = jj_gen;
					jj_consume_token(-1);
					throw new ParseException();
				}
				break;
			default:
				jj_la1[69] = jj_gen;
				;
			}
			try {
				token = jj_consume_token(RBRACE);
		 pos = token.sourceEnd;
			} catch (ParseException e) {
		errorMessage = "']' expected";
		errorLevel   = ERROR;
		errorStart = pos;
		errorEnd   = pos;
		processParseExceptionDebug(e);
			}
	 {if (true) return new ArrayDeclarator(prefix,expression,pos);}
			break;
		default:
			jj_la1[70] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public Literal Literal() throws ParseException {
	final Token token;
	StringLiteral literal;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case INTEGER_LITERAL:
			token = jj_consume_token(INTEGER_LITERAL);
																		{if (true) return new NumberLiteral(token);}
			break;
		case FLOATING_POINT_LITERAL:
			token = jj_consume_token(FLOATING_POINT_LITERAL);
																		{if (true) return new NumberLiteral(token);}
			break;
		case STRING_LITERAL:
			token = jj_consume_token(STRING_LITERAL);
																		{if (true) return new StringLiteral(token);}
			break;
		case TRUE:
			token = jj_consume_token(TRUE);
																		{if (true) return new TrueLiteral(token);}
			break;
		case FALSE:
			token = jj_consume_token(FALSE);
																		{if (true) return new FalseLiteral(token);}
			break;
		case NULL:
			token = jj_consume_token(NULL);
																		{if (true) return new NullLiteral(token);}
			break;
		case DOUBLEQUOTE:
			literal = evaluableString();
																			{if (true) return literal;}
			break;
		default:
			jj_la1[71] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public StringLiteral evaluableString() throws ParseException {
	ArrayList list = new ArrayList();
	Token start,end;
	Token token,lbrace,rbrace;
	AbstractVariable var;
	Expression expr;
		start = jj_consume_token(DOUBLEQUOTE);
		label_20:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case DOLLARS:
				;
				break;
			default:
				jj_la1[72] = jj_gen;
				break label_20;
			}
			jj_consume_token(DOLLARS);
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case IDENTIFIER:
				token = jj_consume_token(IDENTIFIER);
															list.add(new Variable(token.image,
																										token.sourceStart,
																										token.sourceEnd));
				break;
			case LBRACE1:
				lbrace = jj_consume_token(LBRACE1);
				token = jj_consume_token(ID);
					list.add(new Variable(token.image,
																token.sourceStart,
																token.sourceEnd));
				rbrace = jj_consume_token(RBRACE1);
				break;
			default:
				jj_la1[73] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
		}
		end = jj_consume_token(DOUBLEQUOTE2);
	AbstractVariable[] vars = new AbstractVariable[list.size()];
	list.toArray(vars);
	{if (true) return new StringLiteral(jj_input_stream.getCurrentBuffer().substring(start.sourceEnd,end.sourceStart),
													 start.sourceStart,
													 end.sourceEnd,
													 vars);}
		throw new Error("Missing return statement in function");
	}

	final public FunctionCall Arguments(final Expression func) throws ParseException {
Expression[] args = null;
final Token token,lparen;
		lparen = jj_consume_token(LPAREN);
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ARRAY:
		case LIST:
		case PRINT:
		case NEW:
		case NULL:
		case TRUE:
		case FALSE:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
			args = ArgumentList();
			break;
		default:
			jj_la1[74] = jj_gen;
			;
		}
		try {
			token = jj_consume_token(RPAREN);
		 {if (true) return new FunctionCall(func,args,token.sourceEnd);}
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', ')' expected to close the argument list";
		errorLevel   = ERROR;
		if (args == null) {
				errorStart = lparen.sourceEnd+1;
				errorEnd   = lparen.sourceEnd+2;
		} else {
				errorStart = args[args.length-1].sourceEnd+1;
				errorEnd   = args[args.length-1].sourceEnd+2;
		}
		processParseExceptionDebug(e);
		}
	int sourceEnd = (args == null && args.length != 0) ? lparen.sourceEnd+1 : args[args.length-1].sourceEnd;
	{if (true) return new FunctionCall(func,args,sourceEnd);}
		throw new Error("Missing return statement in function");
	}

/**
 * An argument list is a list of arguments separated by comma :
 * argumentDeclaration() (, argumentDeclaration)*
 * @return an array of arguments
 */
	final public Expression[] ArgumentList() throws ParseException {
Expression arg;
final ArrayList list = new ArrayList();
int pos;
Token token;
		arg = Expression();
	 list.add(arg);pos = arg.sourceEnd;
		label_21:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case COMMA:
				;
				break;
			default:
				jj_la1[75] = jj_gen;
				break label_21;
			}
			token = jj_consume_token(COMMA);
										 pos = token.sourceEnd;
			try {
				arg = Expression();
				 list.add(arg);
				 pos = arg.sourceEnd;
			} catch (ParseException e) {
				errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. An expression expected after a comma in argument list";
				errorLevel   = ERROR;
				errorStart   = pos+1;
				errorEnd     = pos+1;
				processParseException(e);
			}
		}
	 final Expression[] arguments = new Expression[list.size()];
	 list.toArray(arguments);
	 {if (true) return arguments;}
		throw new Error("Missing return statement in function");
	}

/**
 * A Statement without break.
 * @return a statement
 */
	final public Statement StatementNoBreak() throws ParseException {
	final Statement statement;
	Token token = null;
		if (jj_2_4(2)) {
			statement = expressionStatement();
																				 {if (true) return statement;}
		} else {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case IDENTIFIER:
				statement = LabeledStatement();
																				 {if (true) return statement;}
				break;
			case LBRACE:
				statement = Block();
																				 {if (true) return statement;}
				break;
			case SEMICOLON:
				statement = EmptyStatement();
																				 {if (true) return statement;}
				break;
			case SWITCH:
				statement = SwitchStatement();
																				 {if (true) return statement;}
				break;
			case IF:
				statement = IfStatement();
																				 {if (true) return statement;}
				break;
			case WHILE:
				statement = WhileStatement();
																				 {if (true) return statement;}
				break;
			case DO:
				statement = DoStatement();
																				 {if (true) return statement;}
				break;
			case FOR:
				statement = ForStatement();
																				 {if (true) return statement;}
				break;
			case FOREACH:
				statement = ForeachStatement();
																				 {if (true) return statement;}
				break;
			case CONTINUE:
				statement = ContinueStatement();
																				 {if (true) return statement;}
				break;
			case RETURN:
				statement = ReturnStatement();
																				 {if (true) return statement;}
				break;
			case ECHO:
				statement = EchoStatement();
																				 {if (true) return statement;}
				break;
			case INCLUDE:
			case REQUIRE:
			case INCLUDE_ONCE:
			case REQUIRE_ONCE:
			case AT:
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case AT:
					token = jj_consume_token(AT);
					break;
				default:
					jj_la1[76] = jj_gen;
					;
				}
				statement = IncludeStatement();
	 if (token != null) {
		((InclusionStatement)statement).silent = true;
		statement.sourceStart = token.sourceStart;
	}
	{if (true) return statement;}
				break;
			case STATIC:
				statement = StaticStatement();
																				 {if (true) return statement;}
				break;
			case GLOBAL:
				statement = GlobalStatement();
																				 {if (true) return statement;}
				break;
			case DEFINE:
				statement = defineStatement();
																				 currentSegment.add((Outlineable)statement);{if (true) return statement;}
				break;
			default:
				jj_la1[77] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
		}
		throw new Error("Missing return statement in function");
	}

/**
 * A statement expression.
 * expression ;
 * @return an expression
 */
	final public Statement expressionStatement() throws ParseException {
	final Statement statement;
	final Token token;
		statement = Expression();
		try {
			token = jj_consume_token(SEMICOLON);
		 statement.sourceEnd = token.sourceEnd;
		} catch (ParseException e) {
		if (e.currentToken.next.kind != PHPParserConstants.PHPEND) {
			errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected";
			errorLevel   = ERROR;
			errorStart = statement.sourceEnd+1;
			errorEnd   = statement.sourceEnd+1;
			processParseExceptionDebug(e);
		}
		}
	 {if (true) return statement;}
		throw new Error("Missing return statement in function");
	}

	final public Define defineStatement() throws ParseException {
	Expression defineName,defineValue;
	final Token defineToken;
	Token token;
	int pos;
		defineToken = jj_consume_token(DEFINE);
													pos = defineToken.sourceEnd+1;
		try {
			token = jj_consume_token(LPAREN);
		 pos = token.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', '(' expected";
		errorLevel   = ERROR;
		errorStart   = pos;
		errorEnd     = pos;
		processParseExceptionDebug(e);
		}
		try {
			defineName = Expression();
		 pos = defineName.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', expression expected";
		errorLevel   = ERROR;
		errorStart   = pos;
		errorEnd     = pos;
		processParseExceptionDebug(e);
		defineName = new StringLiteral(SYNTAX_ERROR_CHAR,pos,pos);
		}
		try {
			token = jj_consume_token(COMMA);
		 pos = defineName.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', ',' expected";
		errorLevel   = ERROR;
		errorStart   = pos;
		errorEnd     = pos;
		processParseExceptionDebug(e);
		}
		try {
			defineValue = Expression();
		 pos = defineValue.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', expression expected";
		errorLevel   = ERROR;
		errorStart   = pos;
		errorEnd     = pos;
		processParseExceptionDebug(e);
		defineValue = new StringLiteral(SYNTAX_ERROR_CHAR,pos,pos);
		}
		try {
			token = jj_consume_token(RPAREN);
		 pos = token.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', ')' expected";
		errorLevel   = ERROR;
		errorStart   = pos;
		errorEnd     = pos;
		processParseExceptionDebug(e);
		}
	 {if (true) return new Define(currentSegment,
										 defineName,
										 defineValue,
										 defineToken.sourceStart,
										 pos);}
		throw new Error("Missing return statement in function");
	}

/**
 * A Normal statement.
 */
	final public Statement Statement() throws ParseException {
	final Statement statement;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case IF:
		case ARRAY:
		case LIST:
		case PRINT:
		case ECHO:
		case INCLUDE:
		case REQUIRE:
		case INCLUDE_ONCE:
		case REQUIRE_ONCE:
		case GLOBAL:
		case DEFINE:
		case STATIC:
		case CONTINUE:
		case DO:
		case FOR:
		case NEW:
		case NULL:
		case RETURN:
		case SWITCH:
		case TRUE:
		case FALSE:
		case WHILE:
		case FOREACH:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
		case LBRACE:
		case SEMICOLON:
			statement = StatementNoBreak();
																	{if (true) return statement;}
			break;
		case BREAK:
			statement = BreakStatement();
																	{if (true) return statement;}
			break;
		default:
			jj_la1[78] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

/**
 * An html block inside a php syntax.
 */
	final public HTMLBlock htmlBlock() throws ParseException {
	final int startIndex = nodePtr;
	final AstNode[] blockNodes;
	final int nbNodes;
	final Token phpEnd;
		phpEnd = jj_consume_token(PHPEND);
	 htmlStart = phpEnd.sourceEnd;
		label_22:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case PHPECHOSTART:
				;
				break;
			default:
				jj_la1[79] = jj_gen;
				break label_22;
			}
			phpEchoBlock();
		}
		try {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case PHPSTARTLONG:
				jj_consume_token(PHPSTARTLONG);
				break;
			case PHPSTARTSHORT:
				jj_consume_token(PHPSTARTSHORT);
				break;
			default:
				jj_la1[80] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
		 createNewHTMLCode();
		} catch (ParseException e) {
		errorMessage = "unexpected end of file , '<?php' expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		{if (true) throw e;}
		}
	nbNodes    = nodePtr - startIndex;
	if (nbNodes == 0) {
		{if (true) return null;}
	}
	blockNodes = new AstNode[nbNodes];
	System.arraycopy(nodes,startIndex+1,blockNodes,0,nbNodes);
	nodePtr = startIndex;
	{if (true) return new HTMLBlock(blockNodes);}
		throw new Error("Missing return statement in function");
	}

/**
 * An include statement. It's "include" an expression;
 */
	final public InclusionStatement IncludeStatement() throws ParseException {
	Expression expr;
	final int keyword;
	final InclusionStatement inclusionStatement;
	final Token token, token2;
	int pos;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case REQUIRE:
			token = jj_consume_token(REQUIRE);
																 keyword = InclusionStatement.REQUIRE;pos=token.sourceEnd;
			break;
		case REQUIRE_ONCE:
			token = jj_consume_token(REQUIRE_ONCE);
																 keyword = InclusionStatement.REQUIRE_ONCE;pos=token.sourceEnd;
			break;
		case INCLUDE:
			token = jj_consume_token(INCLUDE);
																 keyword = InclusionStatement.INCLUDE;pos=token.sourceEnd;
			break;
		case INCLUDE_ONCE:
			token = jj_consume_token(INCLUDE_ONCE);
																 keyword = InclusionStatement.INCLUDE_ONCE;pos=token.sourceEnd;
			break;
		default:
			jj_la1[81] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		try {
			expr = Expression();
		 pos = expr.sourceEnd;
		} catch (ParseException e) {
		if (errorMessage != null) {
			{if (true) throw e;}
		}
		errorMessage = "unexpected token '"+ e.currentToken.next.image+"', expression expected";
		errorLevel   = ERROR;
		errorStart   = e.currentToken.next.sourceStart;
		errorEnd     = e.currentToken.next.sourceEnd;
		expr = new ConstantIdentifier(SYNTAX_ERROR_CHAR,pos,pos);
		processParseExceptionDebug(e);
		}
		try {
			token2 = jj_consume_token(SEMICOLON);
		 pos=token2.sourceEnd;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected";
		errorLevel   = ERROR;
		errorStart   = e.currentToken.next.sourceStart;
		errorEnd     = e.currentToken.next.sourceEnd;
		processParseExceptionDebug(e);
		}
	 inclusionStatement = new InclusionStatement(currentSegment,
																							 keyword,
																							 expr,
																							 token.sourceStart,
																							 pos);
	 currentSegment.add(inclusionStatement);
	 {if (true) return inclusionStatement;}
		throw new Error("Missing return statement in function");
	}

	final public PrintExpression PrintExpression() throws ParseException {
	final Expression expr;
	final Token printToken;
		token = jj_consume_token(PRINT);
		expr = Expression();
	 {if (true) return new PrintExpression(expr,token.sourceStart,expr.sourceEnd);}
		throw new Error("Missing return statement in function");
	}

	final public ListExpression ListExpression() throws ParseException {
	Expression expr = null;
	final Expression expression;
	final ArrayList list = new ArrayList();
	int pos;
	final Token listToken, rParen;
	Token token;
		listToken = jj_consume_token(LIST);
											pos = listToken.sourceEnd;
		try {
			token = jj_consume_token(LPAREN);
											pos = token.sourceEnd;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', '(' expected";
		errorLevel   = ERROR;
		errorStart   = listToken.sourceEnd+1;
		errorEnd     = listToken.sourceEnd+1;
		processParseExceptionDebug(e);
		}
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case DOLLAR:
			expr = VariableDeclaratorId();
		 list.add(expr);pos = expr.sourceEnd;
			break;
		default:
			jj_la1[82] = jj_gen;
			;
		}
	 if (expr == null) list.add(null);
		label_23:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case COMMA:
				;
				break;
			default:
				jj_la1[83] = jj_gen;
				break label_23;
			}
			try {
				token = jj_consume_token(COMMA);
			 pos = token.sourceEnd;
			} catch (ParseException e) {
			errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', ',' expected";
			errorLevel   = ERROR;
			errorStart   = pos+1;
			errorEnd     = pos+1;
			processParseExceptionDebug(e);
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case DOLLAR:
				expr = VariableDeclaratorId();
																		list.add(expr);pos = expr.sourceEnd;
				break;
			default:
				jj_la1[84] = jj_gen;
				;
			}
		}
		try {
			rParen = jj_consume_token(RPAREN);
		 pos = rParen.sourceEnd;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', ')' expected";
		errorLevel   = ERROR;
		errorStart = pos+1;
		errorEnd   = pos+1;
			processParseExceptionDebug(e);
		}
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ASSIGN:
			jj_consume_token(ASSIGN);
			expression = Expression();
		final AbstractVariable[] vars = new AbstractVariable[list.size()];
		list.toArray(vars);
		{if (true) return new ListExpression(vars,
															expression,
															listToken.sourceStart,
															expression.sourceEnd);}
			break;
		default:
			jj_la1[85] = jj_gen;
			;
		}
		final AbstractVariable[] vars = new AbstractVariable[list.size()];
		list.toArray(vars);
		{if (true) return new ListExpression(vars,listToken.sourceStart,pos);}
		throw new Error("Missing return statement in function");
	}

/**
 * An echo statement.
 * echo anyexpression (, otherexpression)*
 */
	final public EchoStatement EchoStatement() throws ParseException {
	final ArrayList expressions = new ArrayList();
	Expression expr;
	Token token;
	Token token2 = null;
		token = jj_consume_token(ECHO);
		expr = Expression();
	 expressions.add(expr);
		label_24:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case COMMA:
				;
				break;
			default:
				jj_la1[86] = jj_gen;
				break label_24;
			}
			jj_consume_token(COMMA);
			expr = Expression();
		 expressions.add(expr);
		}
		try {
			token2 = jj_consume_token(SEMICOLON);
		} catch (ParseException e) {
		if (e.currentToken.next.kind != 4) {
			errorMessage = "';' expected after 'echo' statement";
			errorLevel   = ERROR;
			errorStart   = e.currentToken.sourceEnd;
			errorEnd     = e.currentToken.sourceEnd;
			processParseExceptionDebug(e);
		}
		}
	 final Expression[] exprs = new Expression[expressions.size()];
	 expressions.toArray(exprs);
	 if (token2 == null) {
		 {if (true) return new EchoStatement(exprs,token.sourceStart, exprs[exprs.length-1].sourceEnd);}
	 }
	 {if (true) return new EchoStatement(exprs,token.sourceStart, token2.sourceEnd);}
		throw new Error("Missing return statement in function");
	}

	final public GlobalStatement GlobalStatement() throws ParseException {
	 Variable expr;
	 final ArrayList vars = new ArrayList();
	 final GlobalStatement global;
	 final Token token, token2;
	 int pos;
		token = jj_consume_token(GLOBAL);
		expr = Variable();
		 vars.add(expr);pos = expr.sourceEnd+1;
		label_25:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case COMMA:
				;
				break;
			default:
				jj_la1[87] = jj_gen;
				break label_25;
			}
			jj_consume_token(COMMA);
			expr = Variable();
		 vars.add(expr);pos = expr.sourceEnd+1;
		}
		try {
			token2 = jj_consume_token(SEMICOLON);
		 pos = token2.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. a ';' was expected";
		errorLevel   = ERROR;
		errorStart = pos;
		errorEnd   = pos;
		processParseExceptionDebug(e);
		}
		final Variable[] variables = new Variable[vars.size()];
		vars.toArray(variables);
		global = new GlobalStatement(currentSegment,
																 variables,
																 token.sourceStart,
																 pos);
		currentSegment.add(global);
		{if (true) return global;}
		throw new Error("Missing return statement in function");
	}

	final public StaticStatement StaticStatement() throws ParseException {
	final ArrayList vars = new ArrayList();
	VariableDeclaration expr;
	final Token token, token2;
	int pos;
		token = jj_consume_token(STATIC);
		expr = VariableDeclarator();
																								vars.add(expr);pos = expr.sourceEnd+1;
		label_26:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case COMMA:
				;
				break;
			default:
				jj_la1[88] = jj_gen;
				break label_26;
			}
			jj_consume_token(COMMA);
			expr = VariableDeclarator();
																				 vars.add(expr);pos = expr.sourceEnd+1;
		}
		try {
			token2 = jj_consume_token(SEMICOLON);
		 pos = token2.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. a ';' was expected";
		errorLevel   = ERROR;
		errorStart = pos;
		errorEnd   = pos;
		processParseException(e);
		}
		final VariableDeclaration[] variables = new VariableDeclaration[vars.size()];
		vars.toArray(variables);
		{if (true) return new StaticStatement(variables,
															 token.sourceStart,
															 pos);}
		throw new Error("Missing return statement in function");
	}

	final public LabeledStatement LabeledStatement() throws ParseException {
	final Token label;
	final Statement statement;
		label = jj_consume_token(IDENTIFIER);
		jj_consume_token(COLON);
		statement = Statement();
	 {if (true) return new LabeledStatement(label.image,statement,label.sourceStart,statement.sourceEnd);}
		throw new Error("Missing return statement in function");
	}

/**
 * A Block is
 * {
 * statements
 * }.
 * @return a block
 */
	final public Block Block() throws ParseException {
	final ArrayList list = new ArrayList();
	Statement statement;
	final Token token, token2;
	int pos,start;
		try {
			token = jj_consume_token(LBRACE);
		 pos = token.sourceEnd+1;start=token.sourceStart;
		} catch (ParseException e) {
		errorMessage = "'{' expected";
		errorLevel   = ERROR;
		pos = this.token.sourceEnd+1;
		start=pos;
		errorStart = pos;
		errorEnd   = pos;
		processParseExceptionDebug(e);
		}
		label_27:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case PHPEND:
			case CLASS:
			case FUNCTION:
			case IF:
			case ARRAY:
			case BREAK:
			case LIST:
			case PRINT:
			case ECHO:
			case INCLUDE:
			case REQUIRE:
			case INCLUDE_ONCE:
			case REQUIRE_ONCE:
			case GLOBAL:
			case DEFINE:
			case STATIC:
			case CONTINUE:
			case DO:
			case FOR:
			case NEW:
			case NULL:
			case RETURN:
			case SWITCH:
			case TRUE:
			case FALSE:
			case WHILE:
			case FOREACH:
			case AT:
			case BANG:
			case TILDE:
			case PLUS_PLUS:
			case MINUS_MINUS:
			case PLUS:
			case MINUS:
			case BIT_AND:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
			case DOLLAR:
			case IDENTIFIER:
			case LPAREN:
			case LBRACE:
			case SEMICOLON:
				;
				break;
			default:
				jj_la1[89] = jj_gen;
				break label_27;
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case CLASS:
			case FUNCTION:
			case IF:
			case ARRAY:
			case BREAK:
			case LIST:
			case PRINT:
			case ECHO:
			case INCLUDE:
			case REQUIRE:
			case INCLUDE_ONCE:
			case REQUIRE_ONCE:
			case GLOBAL:
			case DEFINE:
			case STATIC:
			case CONTINUE:
			case DO:
			case FOR:
			case NEW:
			case NULL:
			case RETURN:
			case SWITCH:
			case TRUE:
			case FALSE:
			case WHILE:
			case FOREACH:
			case AT:
			case BANG:
			case TILDE:
			case PLUS_PLUS:
			case MINUS_MINUS:
			case PLUS:
			case MINUS:
			case BIT_AND:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
			case DOLLAR:
			case IDENTIFIER:
			case LPAREN:
			case LBRACE:
			case SEMICOLON:
				statement = BlockStatement();
																	list.add(statement);pos = statement.sourceEnd+1;
				break;
			case PHPEND:
				statement = htmlBlock();
																	if (statement != null) {
																		list.add(statement);
																		pos = statement.sourceEnd+1;
																	}
																	pos = this.token.sourceEnd+1;
				break;
			default:
				jj_la1[90] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
		}
		try {
			token2 = jj_consume_token(RBRACE);
		 pos = token2.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.image +"', '}' expected";
		errorLevel   = ERROR;
		errorStart = pos;
		errorEnd   = pos;
		processParseExceptionDebug(e);
		}
	final Statement[] statements = new Statement[list.size()];
	list.toArray(statements);
	{if (true) return new Block(statements,start,pos);}
		throw new Error("Missing return statement in function");
	}

	final public Statement BlockStatement() throws ParseException {
	final Statement statement;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case IF:
		case ARRAY:
		case BREAK:
		case LIST:
		case PRINT:
		case ECHO:
		case INCLUDE:
		case REQUIRE:
		case INCLUDE_ONCE:
		case REQUIRE_ONCE:
		case GLOBAL:
		case DEFINE:
		case STATIC:
		case CONTINUE:
		case DO:
		case FOR:
		case NEW:
		case NULL:
		case RETURN:
		case SWITCH:
		case TRUE:
		case FALSE:
		case WHILE:
		case FOREACH:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
		case LBRACE:
		case SEMICOLON:
			try {
				statement = Statement();
																		 if (phpDocument == currentSegment) pushOnAstNodes(statement);
																		 {if (true) return statement;}
			} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.image +"', a statement was expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		{if (true) throw e;}
			}
			break;
		case CLASS:
			statement = ClassDeclaration();
																	 {if (true) return statement;}
			break;
		case FUNCTION:
			statement = MethodDeclaration();
																	 if (phpDocument == currentSegment) pushOnAstNodes(statement);
																	 currentSegment.add((MethodDeclaration) statement);
																	 ((MethodDeclaration) statement).analyzeCode();
																	 {if (true) return statement;}
			break;
		default:
			jj_la1[91] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

/**
 * A Block statement that will not contain any 'break'
 */
	final public Statement BlockStatementNoBreak() throws ParseException {
	final Statement statement;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case IF:
		case ARRAY:
		case LIST:
		case PRINT:
		case ECHO:
		case INCLUDE:
		case REQUIRE:
		case INCLUDE_ONCE:
		case REQUIRE_ONCE:
		case GLOBAL:
		case DEFINE:
		case STATIC:
		case CONTINUE:
		case DO:
		case FOR:
		case NEW:
		case NULL:
		case RETURN:
		case SWITCH:
		case TRUE:
		case FALSE:
		case WHILE:
		case FOREACH:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
		case LBRACE:
		case SEMICOLON:
			statement = StatementNoBreak();
																	 {if (true) return statement;}
			break;
		case CLASS:
			statement = ClassDeclaration();
																	 {if (true) return statement;}
			break;
		case FUNCTION:
			statement = MethodDeclaration();
																	 currentSegment.add((MethodDeclaration) statement);
																	 ((MethodDeclaration) statement).analyzeCode();
																	 {if (true) return statement;}
			break;
		default:
			jj_la1[92] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

/**
 * used only by ForInit()
 */
	final public Expression[] LocalVariableDeclaration() throws ParseException {
	final ArrayList list = new ArrayList();
	Expression var;
		var = Expression();
	 list.add(var);
		label_28:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case COMMA:
				;
				break;
			default:
				jj_la1[93] = jj_gen;
				break label_28;
			}
			jj_consume_token(COMMA);
			var = Expression();
																list.add(var);
		}
		final Expression[] vars = new Expression[list.size()];
		list.toArray(vars);
		{if (true) return vars;}
		throw new Error("Missing return statement in function");
	}

/**
 * used only by LocalVariableDeclaration().
 */
	final public VariableDeclaration LocalVariableDeclarator() throws ParseException {
	final Variable varName;
	Expression initializer = null;
		varName = Variable();
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ASSIGN:
			jj_consume_token(ASSIGN);
			initializer = Expression();
			break;
		default:
			jj_la1[94] = jj_gen;
			;
		}
	 if (initializer == null) {
		{if (true) return new VariableDeclaration(currentSegment,
																	 varName,
																	 varName.sourceStart,
																	 varName.sourceEnd);}
	 }
		{if (true) return new VariableDeclaration(currentSegment,
																	 varName,
																	 initializer,
																	 VariableDeclaration.EQUAL,
																	 varName.sourceStart);}
		throw new Error("Missing return statement in function");
	}

	final public EmptyStatement EmptyStatement() throws ParseException {
	final Token token;
		token = jj_consume_token(SEMICOLON);
	 {if (true) return new EmptyStatement(token.sourceStart,token.sourceEnd);}
		throw new Error("Missing return statement in function");
	}

/**
 * used only by StatementExpressionList() which is used only by ForInit() and ForStatement()
 */
	final public Expression StatementExpression() throws ParseException {
	final Expression expr;
	final Token operator;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case PLUS_PLUS:
		case MINUS_MINUS:
			expr = PreIncDecExpression();
																{if (true) return expr;}
			break;
		case ARRAY:
		case NEW:
		case BIT_AND:
		case DOLLAR:
		case IDENTIFIER:
			expr = PrimaryExpression();
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case PLUS_PLUS:
			case MINUS_MINUS:
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case PLUS_PLUS:
					operator = jj_consume_token(PLUS_PLUS);
														{if (true) return new PostfixedUnaryExpression(expr,
																																OperatorIds.PLUS_PLUS,
																																operator.sourceEnd);}
					break;
				case MINUS_MINUS:
					operator = jj_consume_token(MINUS_MINUS);
															{if (true) return new PostfixedUnaryExpression(expr,
																																	OperatorIds.MINUS_MINUS,
																																	operator.sourceEnd);}
					break;
				default:
					jj_la1[95] = jj_gen;
					jj_consume_token(-1);
					throw new ParseException();
				}
				break;
			default:
				jj_la1[96] = jj_gen;
				;
			}
	 {if (true) return expr;}
			break;
		default:
			jj_la1[97] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public SwitchStatement SwitchStatement() throws ParseException {
	Expression variable;
	final AbstractCase[] cases;
	final Token switchToken,lparenToken,rparenToken;
	int pos;
		switchToken = jj_consume_token(SWITCH);
													pos = switchToken.sourceEnd+1;
		try {
			lparenToken = jj_consume_token(LPAREN);
		 pos = lparenToken.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "'(' expected after 'switch'";
		errorLevel   = ERROR;
		errorStart = pos;
		errorEnd   = pos;
		processParseExceptionDebug(e);
		}
		try {
			variable = Expression();
														 pos = variable.sourceEnd+1;
		} catch (ParseException e) {
		if (errorMessage != null) {
			{if (true) throw e;}
		}
		errorMessage = "expression expected";
		errorLevel   = ERROR;
		errorStart = pos;
		errorEnd   = pos;
		processParseExceptionDebug(e);
		variable = new ConstantIdentifier(SYNTAX_ERROR_CHAR,pos,pos);
		}
		try {
			rparenToken = jj_consume_token(RPAREN);
														pos = rparenToken.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "')' expected";
		errorLevel   = ERROR;
		errorStart = pos;
		errorEnd   = pos;
		processParseExceptionDebug(e);
		}
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case LBRACE:
			cases = switchStatementBrace();
			break;
		case COLON:
			cases = switchStatementColon(switchToken.sourceStart, switchToken.sourceEnd);
			break;
		default:
			jj_la1[98] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
	 {if (true) return new SwitchStatement(variable,
															cases,
															switchToken.sourceStart,
															this.token.sourceEnd);}
		throw new Error("Missing return statement in function");
	}

	final public AbstractCase[] switchStatementBrace() throws ParseException {
	AbstractCase cas;
	final ArrayList cases = new ArrayList();
	Token token;
	int pos;
		token = jj_consume_token(LBRACE);
										pos = token.sourceEnd;
		label_29:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case CASE:
			case _DEFAULT:
				;
				break;
			default:
				jj_la1[99] = jj_gen;
				break label_29;
			}
			cas = switchLabel0();
												 cases.add(cas);pos = cas.sourceEnd;
		}
		try {
			token = jj_consume_token(RBRACE);
		 pos = token.sourceEnd;
		} catch (ParseException e) {
		errorMessage = "'}' expected";
		errorLevel   = ERROR;
		errorStart = pos+1;
		errorEnd   = pos+1;
		processParseExceptionDebug(e);
		}
		final AbstractCase[] abcase = new AbstractCase[cases.size()];
		cases.toArray(abcase);
		{if (true) return abcase;}
		throw new Error("Missing return statement in function");
	}

/**
 * A Switch statement with : ... endswitch;
 * @param start the begin offset of the switch
 * @param end the end offset of the switch
 */
	final public AbstractCase[] switchStatementColon(final int start, final int end) throws ParseException {
	AbstractCase cas;
	final ArrayList cases = new ArrayList();
	Token token;
	int pos;
		token = jj_consume_token(COLON);
									 pos = token.sourceEnd;
	 try {
	setMarker(fileToParse,
						"Ugly syntax detected, you should switch () {...} instead of switch (): ... enswitch;",
						start,
						end,
						INFO,
						"Line " + token.beginLine);
	} catch (CoreException e) {
		PHPeclipsePlugin.log(e);
	}
		label_30:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case CASE:
			case _DEFAULT:
				;
				break;
			default:
				jj_la1[100] = jj_gen;
				break label_30;
			}
			cas = switchLabel0();
													cases.add(cas);pos = cas.sourceEnd;
		}
		try {
			token = jj_consume_token(ENDSWITCH);
												 pos = token.sourceEnd;
		} catch (ParseException e) {
		errorMessage = "'endswitch' expected";
		errorLevel   = ERROR;
		errorStart = pos+1;
		errorEnd   = pos+1;
		processParseExceptionDebug(e);
		}
		try {
			token = jj_consume_token(SEMICOLON);
												 pos = token.sourceEnd;
		} catch (ParseException e) {
		errorMessage = "';' expected after 'endswitch' keyword";
		errorLevel   = ERROR;
		errorStart = pos+1;
		errorEnd   = pos+1;
		processParseExceptionDebug(e);
		}
		final AbstractCase[] abcase = new AbstractCase[cases.size()];
		cases.toArray(abcase);
		{if (true) return abcase;}
		throw new Error("Missing return statement in function");
	}

	final public AbstractCase switchLabel0() throws ParseException {
	final Expression expr;
	Statement statement;
	final ArrayList stmts = new ArrayList();
	final Token token = this.token;
	final int start = this.token.next.sourceStart;
		expr = SwitchLabel();
		label_31:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case PHPEND:
			case CLASS:
			case FUNCTION:
			case IF:
			case ARRAY:
			case BREAK:
			case LIST:
			case PRINT:
			case ECHO:
			case INCLUDE:
			case REQUIRE:
			case INCLUDE_ONCE:
			case REQUIRE_ONCE:
			case GLOBAL:
			case DEFINE:
			case STATIC:
			case CONTINUE:
			case DO:
			case FOR:
			case NEW:
			case NULL:
			case RETURN:
			case SWITCH:
			case TRUE:
			case FALSE:
			case WHILE:
			case FOREACH:
			case AT:
			case BANG:
			case TILDE:
			case PLUS_PLUS:
			case MINUS_MINUS:
			case PLUS:
			case MINUS:
			case BIT_AND:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
			case DOLLAR:
			case IDENTIFIER:
			case LPAREN:
			case LBRACE:
			case SEMICOLON:
				;
				break;
			default:
				jj_la1[101] = jj_gen;
				break label_31;
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case CLASS:
			case FUNCTION:
			case IF:
			case ARRAY:
			case LIST:
			case PRINT:
			case ECHO:
			case INCLUDE:
			case REQUIRE:
			case INCLUDE_ONCE:
			case REQUIRE_ONCE:
			case GLOBAL:
			case DEFINE:
			case STATIC:
			case CONTINUE:
			case DO:
			case FOR:
			case NEW:
			case NULL:
			case RETURN:
			case SWITCH:
			case TRUE:
			case FALSE:
			case WHILE:
			case FOREACH:
			case AT:
			case BANG:
			case TILDE:
			case PLUS_PLUS:
			case MINUS_MINUS:
			case PLUS:
			case MINUS:
			case BIT_AND:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
			case DOLLAR:
			case IDENTIFIER:
			case LPAREN:
			case LBRACE:
			case SEMICOLON:
				statement = BlockStatementNoBreak();
																				 stmts.add(statement);
				break;
			case PHPEND:
				statement = htmlBlock();
																				 if (statement != null) {stmts.add(statement);}
				break;
			case BREAK:
				statement = BreakStatement();
																				 stmts.add(statement);
				break;
			default:
				jj_la1[102] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
		}
		final int listSize = stmts.size();
		final Statement[] stmtsArray = new Statement[listSize];
		stmts.toArray(stmtsArray);
		if (expr == null) {//it's a default
			final int end = this.token.next.sourceStart;
			{if (true) return new DefaultCase(stmtsArray,start,end);}
		}
		if (listSize != 0) {
			{if (true) return new Case(expr,stmtsArray,expr.sourceStart,stmtsArray[listSize-1].sourceEnd);}
		} else {
			{if (true) return new Case(expr,stmtsArray,expr.sourceStart,expr.sourceEnd);}
		}
		throw new Error("Missing return statement in function");
	}

/**
 * A SwitchLabel.
 * case Expression() :
 * default :
 * @return the if it was a case and null if not
 */
	final public Expression SwitchLabel() throws ParseException {
	final Expression expr;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case CASE:
			token = jj_consume_token(CASE);
			try {
				expr = Expression();
			} catch (ParseException e) {
		if (errorMessage != null) {if (true) throw e;}
		errorMessage = "expression expected after 'case' keyword";
		errorLevel   = ERROR;
		errorStart = token.sourceEnd +1;
		errorEnd   = token.sourceEnd +1;
		{if (true) throw e;}
			}
			try {
				token = jj_consume_token(COLON);
			} catch (ParseException e) {
		errorMessage = "':' expected after case expression";
		errorLevel   = ERROR;
		errorStart = expr.sourceEnd+1;
		errorEnd   = expr.sourceEnd+1;
		processParseExceptionDebug(e);
			}
	 {if (true) return expr;}
			break;
		case _DEFAULT:
			token = jj_consume_token(_DEFAULT);
			try {
				jj_consume_token(COLON);
			} catch (ParseException e) {
		errorMessage = "':' expected after 'default' keyword";
		errorLevel   = ERROR;
		errorStart = token.sourceEnd+1;
		errorEnd   = token.sourceEnd+1;
		processParseExceptionDebug(e);
			}
	 {if (true) return null;}
			break;
		default:
			jj_la1[103] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public Break BreakStatement() throws ParseException {
	Expression expression = null;
	final Token token, token2;
	int pos;
		token = jj_consume_token(BREAK);
									 pos = token.sourceEnd+1;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ARRAY:
		case LIST:
		case PRINT:
		case NEW:
		case NULL:
		case TRUE:
		case FALSE:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
			expression = Expression();
															 pos = expression.sourceEnd+1;
			break;
		default:
			jj_la1[104] = jj_gen;
			;
		}
		try {
			token2 = jj_consume_token(SEMICOLON);
		 pos = token2.sourceEnd;
		} catch (ParseException e) {
		errorMessage = "';' expected after 'break' keyword";
		errorLevel   = ERROR;
		errorStart = pos;
		errorEnd   = pos;
		processParseExceptionDebug(e);
		}
	 {if (true) return new Break(expression, token.sourceStart, pos);}
		throw new Error("Missing return statement in function");
	}

	final public IfStatement IfStatement() throws ParseException {
	final Expression condition;
	final IfStatement ifStatement;
	Token token;
		token = jj_consume_token(IF);
		condition = Condition("if");
		ifStatement = IfStatement0(condition,token.sourceStart,token.sourceEnd);
	 {if (true) return ifStatement;}
		throw new Error("Missing return statement in function");
	}

	final public Expression Condition(final String keyword) throws ParseException {
	final Expression condition;
		try {
			jj_consume_token(LPAREN);
		} catch (ParseException e) {
		errorMessage = "'(' expected after " + keyword + " keyword";
		errorLevel   = ERROR;
		errorStart = this.token.sourceEnd + 1;
		errorEnd   = this.token.sourceEnd + 1;
		processParseExceptionDebug(e);
		}
		condition = Expression();
		try {
			jj_consume_token(RPAREN);
		} catch (ParseException e) {
		errorMessage = "')' expected after " + keyword + " keyword";
		errorLevel   = ERROR;
		errorStart = condition.sourceEnd+1;
		errorEnd   = condition.sourceEnd+1;
		processParseExceptionDebug(e);
		}
	 {if (true) return condition;}
		throw new Error("Missing return statement in function");
	}

	final public IfStatement IfStatement0(final Expression condition, final int start,final int end) throws ParseException {
	Statement statement;
	final Statement stmt;
	final Statement[] statementsArray;
	ElseIf elseifStatement;
	Else elseStatement = null;
	final ArrayList stmts;
	final ArrayList elseIfList = new ArrayList();
	final ElseIf[] elseIfs;
	int pos = jj_input_stream.getPosition();
	final int endStatements;
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case COLON:
			jj_consume_token(COLON);
	 stmts = new ArrayList();
			label_32:
			while (true) {
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case PHPEND:
				case IF:
				case ARRAY:
				case BREAK:
				case LIST:
				case PRINT:
				case ECHO:
				case INCLUDE:
				case REQUIRE:
				case INCLUDE_ONCE:
				case REQUIRE_ONCE:
				case GLOBAL:
				case DEFINE:
				case STATIC:
				case CONTINUE:
				case DO:
				case FOR:
				case NEW:
				case NULL:
				case RETURN:
				case SWITCH:
				case TRUE:
				case FALSE:
				case WHILE:
				case FOREACH:
				case AT:
				case BANG:
				case TILDE:
				case PLUS_PLUS:
				case MINUS_MINUS:
				case PLUS:
				case MINUS:
				case BIT_AND:
				case INTEGER_LITERAL:
				case FLOATING_POINT_LITERAL:
				case STRING_LITERAL:
				case DOUBLEQUOTE:
				case DOLLAR:
				case IDENTIFIER:
				case LPAREN:
				case LBRACE:
				case SEMICOLON:
					;
					break;
				default:
					jj_la1[105] = jj_gen;
					break label_32;
				}
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case IF:
				case ARRAY:
				case BREAK:
				case LIST:
				case PRINT:
				case ECHO:
				case INCLUDE:
				case REQUIRE:
				case INCLUDE_ONCE:
				case REQUIRE_ONCE:
				case GLOBAL:
				case DEFINE:
				case STATIC:
				case CONTINUE:
				case DO:
				case FOR:
				case NEW:
				case NULL:
				case RETURN:
				case SWITCH:
				case TRUE:
				case FALSE:
				case WHILE:
				case FOREACH:
				case AT:
				case BANG:
				case TILDE:
				case PLUS_PLUS:
				case MINUS_MINUS:
				case PLUS:
				case MINUS:
				case BIT_AND:
				case INTEGER_LITERAL:
				case FLOATING_POINT_LITERAL:
				case STRING_LITERAL:
				case DOUBLEQUOTE:
				case DOLLAR:
				case IDENTIFIER:
				case LPAREN:
				case LBRACE:
				case SEMICOLON:
					statement = Statement();
															stmts.add(statement);
					break;
				case PHPEND:
					statement = htmlBlock();
															if (statement != null) {stmts.add(statement);}
					break;
				default:
					jj_la1[106] = jj_gen;
					jj_consume_token(-1);
					throw new ParseException();
				}
			}
		endStatements = jj_input_stream.getPosition();
			label_33:
			while (true) {
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case ELSEIF:
					;
					break;
				default:
					jj_la1[107] = jj_gen;
					break label_33;
				}
				elseifStatement = ElseIfStatementColon();
																							elseIfList.add(elseifStatement);
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case ELSE:
				elseStatement = ElseStatementColon();
				break;
			default:
				jj_la1[108] = jj_gen;
				;
			}
	 try {
	setMarker(fileToParse,
						"Ugly syntax detected, you should if () {...} instead of if (): ... endif;",
						start,
						end,
						INFO,
						"Line " + token.beginLine);
	} catch (CoreException e) {
		PHPeclipsePlugin.log(e);
	}
			try {
				jj_consume_token(ENDIF);
			} catch (ParseException e) {
		errorMessage = "'endif' expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		{if (true) throw e;}
			}
			try {
				jj_consume_token(SEMICOLON);
			} catch (ParseException e) {
		errorMessage = "';' expected after 'endif' keyword";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		{if (true) throw e;}
			}
		elseIfs = new ElseIf[elseIfList.size()];
		elseIfList.toArray(elseIfs);
		if (stmts.size() == 1) {
			{if (true) return new IfStatement(condition,
														 (Statement) stmts.get(0),
															elseIfs,
															elseStatement,
															pos,
															jj_input_stream.getPosition());}
		} else {
			statementsArray = new Statement[stmts.size()];
			stmts.toArray(statementsArray);
			{if (true) return new IfStatement(condition,
														 new Block(statementsArray,pos,endStatements),
														 elseIfs,
														 elseStatement,
														 pos,
														 jj_input_stream.getPosition());}
		}
			break;
		case PHPEND:
		case IF:
		case ARRAY:
		case BREAK:
		case LIST:
		case PRINT:
		case ECHO:
		case INCLUDE:
		case REQUIRE:
		case INCLUDE_ONCE:
		case REQUIRE_ONCE:
		case GLOBAL:
		case DEFINE:
		case STATIC:
		case CONTINUE:
		case DO:
		case FOR:
		case NEW:
		case NULL:
		case RETURN:
		case SWITCH:
		case TRUE:
		case FALSE:
		case WHILE:
		case FOREACH:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
		case LBRACE:
		case SEMICOLON:
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case IF:
			case ARRAY:
			case BREAK:
			case LIST:
			case PRINT:
			case ECHO:
			case INCLUDE:
			case REQUIRE:
			case INCLUDE_ONCE:
			case REQUIRE_ONCE:
			case GLOBAL:
			case DEFINE:
			case STATIC:
			case CONTINUE:
			case DO:
			case FOR:
			case NEW:
			case NULL:
			case RETURN:
			case SWITCH:
			case TRUE:
			case FALSE:
			case WHILE:
			case FOREACH:
			case AT:
			case BANG:
			case TILDE:
			case PLUS_PLUS:
			case MINUS_MINUS:
			case PLUS:
			case MINUS:
			case BIT_AND:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
			case DOLLAR:
			case IDENTIFIER:
			case LPAREN:
			case LBRACE:
			case SEMICOLON:
				stmt = Statement();
				break;
			case PHPEND:
				stmt = htmlBlock();
				break;
			default:
				jj_la1[109] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
			label_34:
			while (true) {
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case ELSEIF:
					;
					break;
				default:
					jj_la1[110] = jj_gen;
					break label_34;
				}
				elseifStatement = ElseIfStatement();
																											elseIfList.add(elseifStatement);
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case ELSE:
				jj_consume_token(ELSE);
				try {
			 pos = jj_input_stream.getPosition();
					statement = Statement();
			 elseStatement = new Else(statement,pos,jj_input_stream.getPosition());
				} catch (ParseException e) {
			if (errorMessage != null) {
				{if (true) throw e;}
			}
			errorMessage = "unexpected token '"+e.currentToken.next.image+"', a statement was expected";
			errorLevel   = ERROR;
			errorStart = e.currentToken.sourceStart;
			errorEnd   = e.currentToken.sourceEnd;
			{if (true) throw e;}
				}
				break;
			default:
				jj_la1[111] = jj_gen;
				;
			}
		elseIfs = new ElseIf[elseIfList.size()];
		elseIfList.toArray(elseIfs);
		{if (true) return new IfStatement(condition,
													 stmt,
													 elseIfs,
													 elseStatement,
													 pos,
													 jj_input_stream.getPosition());}
			break;
		default:
			jj_la1[112] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public ElseIf ElseIfStatementColon() throws ParseException {
	final Expression condition;
	Statement statement;
	final ArrayList list = new ArrayList();
	final Token elseifToken;
		elseifToken = jj_consume_token(ELSEIF);
		condition = Condition("elseif");
		jj_consume_token(COLON);
		label_35:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case PHPEND:
			case IF:
			case ARRAY:
			case BREAK:
			case LIST:
			case PRINT:
			case ECHO:
			case INCLUDE:
			case REQUIRE:
			case INCLUDE_ONCE:
			case REQUIRE_ONCE:
			case GLOBAL:
			case DEFINE:
			case STATIC:
			case CONTINUE:
			case DO:
			case FOR:
			case NEW:
			case NULL:
			case RETURN:
			case SWITCH:
			case TRUE:
			case FALSE:
			case WHILE:
			case FOREACH:
			case AT:
			case BANG:
			case TILDE:
			case PLUS_PLUS:
			case MINUS_MINUS:
			case PLUS:
			case MINUS:
			case BIT_AND:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
			case DOLLAR:
			case IDENTIFIER:
			case LPAREN:
			case LBRACE:
			case SEMICOLON:
				;
				break;
			default:
				jj_la1[113] = jj_gen;
				break label_35;
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case IF:
			case ARRAY:
			case BREAK:
			case LIST:
			case PRINT:
			case ECHO:
			case INCLUDE:
			case REQUIRE:
			case INCLUDE_ONCE:
			case REQUIRE_ONCE:
			case GLOBAL:
			case DEFINE:
			case STATIC:
			case CONTINUE:
			case DO:
			case FOR:
			case NEW:
			case NULL:
			case RETURN:
			case SWITCH:
			case TRUE:
			case FALSE:
			case WHILE:
			case FOREACH:
			case AT:
			case BANG:
			case TILDE:
			case PLUS_PLUS:
			case MINUS_MINUS:
			case PLUS:
			case MINUS:
			case BIT_AND:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
			case DOLLAR:
			case IDENTIFIER:
			case LPAREN:
			case LBRACE:
			case SEMICOLON:
				statement = Statement();
																			list.add(statement);
				break;
			case PHPEND:
				statement = htmlBlock();
																			if (statement != null) {list.add(statement);}
				break;
			default:
				jj_la1[114] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
		}
	final int sizeList = list.size();
	final Statement[] stmtsArray = new Statement[sizeList];
	list.toArray(stmtsArray);
	{if (true) return new ElseIf(condition,stmtsArray ,
										elseifToken.sourceStart,
										stmtsArray[sizeList-1].sourceEnd);}
		throw new Error("Missing return statement in function");
	}

	final public Else ElseStatementColon() throws ParseException {
	Statement statement;
	final ArrayList list = new ArrayList();
	final Token elseToken;
		elseToken = jj_consume_token(ELSE);
		jj_consume_token(COLON);
		label_36:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case PHPEND:
			case IF:
			case ARRAY:
			case BREAK:
			case LIST:
			case PRINT:
			case ECHO:
			case INCLUDE:
			case REQUIRE:
			case INCLUDE_ONCE:
			case REQUIRE_ONCE:
			case GLOBAL:
			case DEFINE:
			case STATIC:
			case CONTINUE:
			case DO:
			case FOR:
			case NEW:
			case NULL:
			case RETURN:
			case SWITCH:
			case TRUE:
			case FALSE:
			case WHILE:
			case FOREACH:
			case AT:
			case BANG:
			case TILDE:
			case PLUS_PLUS:
			case MINUS_MINUS:
			case PLUS:
			case MINUS:
			case BIT_AND:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
			case DOLLAR:
			case IDENTIFIER:
			case LPAREN:
			case LBRACE:
			case SEMICOLON:
				;
				break;
			default:
				jj_la1[115] = jj_gen;
				break label_36;
			}
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case IF:
			case ARRAY:
			case BREAK:
			case LIST:
			case PRINT:
			case ECHO:
			case INCLUDE:
			case REQUIRE:
			case INCLUDE_ONCE:
			case REQUIRE_ONCE:
			case GLOBAL:
			case DEFINE:
			case STATIC:
			case CONTINUE:
			case DO:
			case FOR:
			case NEW:
			case NULL:
			case RETURN:
			case SWITCH:
			case TRUE:
			case FALSE:
			case WHILE:
			case FOREACH:
			case AT:
			case BANG:
			case TILDE:
			case PLUS_PLUS:
			case MINUS_MINUS:
			case PLUS:
			case MINUS:
			case BIT_AND:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
			case DOLLAR:
			case IDENTIFIER:
			case LPAREN:
			case LBRACE:
			case SEMICOLON:
				statement = Statement();
																												 list.add(statement);
				break;
			case PHPEND:
				statement = htmlBlock();
																						 if (statement != null) {list.add(statement);}
				break;
			default:
				jj_la1[116] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
		}
	final int sizeList = list.size();
	final Statement[] stmtsArray = new Statement[sizeList];
	list.toArray(stmtsArray);
	{if (true) return new Else(stmtsArray,elseToken.sourceStart,stmtsArray[sizeList-1].sourceEnd);}
		throw new Error("Missing return statement in function");
	}

	final public ElseIf ElseIfStatement() throws ParseException {
	final Expression condition;
	//final Statement statement;
	final Token elseifToken;
	final Statement[] statement = new Statement[1];
		elseifToken = jj_consume_token(ELSEIF);
		condition = Condition("elseif");
		statement[0] = Statement();
	{if (true) return new ElseIf(condition,statement,elseifToken.sourceStart,statement[0].sourceEnd);}
		throw new Error("Missing return statement in function");
	}

	final public WhileStatement WhileStatement() throws ParseException {
	final Expression condition;
	final Statement action;
	final Token whileToken;
		whileToken = jj_consume_token(WHILE);
		condition = Condition("while");
		action = WhileStatement0(whileToken.sourceStart,whileToken.sourceEnd);
		 {if (true) return new WhileStatement(condition,action,whileToken.sourceStart,action.sourceEnd);}
		throw new Error("Missing return statement in function");
	}

	final public Statement WhileStatement0(final int start, final int end) throws ParseException {
	Statement statement;
	final ArrayList stmts = new ArrayList();
	final int pos = jj_input_stream.getPosition();
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case COLON:
			jj_consume_token(COLON);
			label_37:
			while (true) {
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case IF:
				case ARRAY:
				case BREAK:
				case LIST:
				case PRINT:
				case ECHO:
				case INCLUDE:
				case REQUIRE:
				case INCLUDE_ONCE:
				case REQUIRE_ONCE:
				case GLOBAL:
				case DEFINE:
				case STATIC:
				case CONTINUE:
				case DO:
				case FOR:
				case NEW:
				case NULL:
				case RETURN:
				case SWITCH:
				case TRUE:
				case FALSE:
				case WHILE:
				case FOREACH:
				case AT:
				case BANG:
				case TILDE:
				case PLUS_PLUS:
				case MINUS_MINUS:
				case PLUS:
				case MINUS:
				case BIT_AND:
				case INTEGER_LITERAL:
				case FLOATING_POINT_LITERAL:
				case STRING_LITERAL:
				case DOUBLEQUOTE:
				case DOLLAR:
				case IDENTIFIER:
				case LPAREN:
				case LBRACE:
				case SEMICOLON:
					;
					break;
				default:
					jj_la1[117] = jj_gen;
					break label_37;
				}
				statement = Statement();
																		stmts.add(statement);
			}
	 try {
	setMarker(fileToParse,
						"Ugly syntax detected, you should while () {...} instead of while (): ... endwhile;",
						start,
						end,
						INFO,
						"Line " + token.beginLine);
	} catch (CoreException e) {
		PHPeclipsePlugin.log(e);
	}
			try {
				jj_consume_token(ENDWHILE);
			} catch (ParseException e) {
		errorMessage = "'endwhile' expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		{if (true) throw e;}
			}
			try {
				jj_consume_token(SEMICOLON);
		final Statement[] stmtsArray = new Statement[stmts.size()];
		stmts.toArray(stmtsArray);
		{if (true) return new Block(stmtsArray,pos,jj_input_stream.getPosition());}
			} catch (ParseException e) {
		errorMessage = "';' expected after 'endwhile' keyword";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		{if (true) throw e;}
			}
			break;
		case IF:
		case ARRAY:
		case BREAK:
		case LIST:
		case PRINT:
		case ECHO:
		case INCLUDE:
		case REQUIRE:
		case INCLUDE_ONCE:
		case REQUIRE_ONCE:
		case GLOBAL:
		case DEFINE:
		case STATIC:
		case CONTINUE:
		case DO:
		case FOR:
		case NEW:
		case NULL:
		case RETURN:
		case SWITCH:
		case TRUE:
		case FALSE:
		case WHILE:
		case FOREACH:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
		case LBRACE:
		case SEMICOLON:
			statement = Statement();
	 {if (true) return statement;}
			break;
		default:
			jj_la1[118] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public DoStatement DoStatement() throws ParseException {
	final Statement action;
	final Expression condition;
	final Token token;
	Token token2 = null;
		token = jj_consume_token(DO);
		action = Statement();
		jj_consume_token(WHILE);
		condition = Condition("while");
		try {
			token2 = jj_consume_token(SEMICOLON);
		} catch (ParseException e) {
		errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected";
		errorLevel   = ERROR;
		errorStart = condition.sourceEnd+1;
		errorEnd   = condition.sourceEnd+1;
		processParseExceptionDebug(e);
		}
		if (token2 == null) {
			{if (true) return new DoStatement(condition,action,token.sourceStart,condition.sourceEnd);}
		}
		{if (true) return new DoStatement(condition,action,token.sourceStart,token2.sourceEnd);}
		throw new Error("Missing return statement in function");
	}

	final public ForeachStatement ForeachStatement() throws ParseException {
	Statement statement = null;
	Expression expression = null;
	ArrayVariableDeclaration variable = null;
	Token foreachToken;
	Token lparenToken = null;
	Token asToken = null;
	Token rparenToken = null;
	int pos;
		foreachToken = jj_consume_token(FOREACH);
		try {
			lparenToken = jj_consume_token(LPAREN);
		 pos = lparenToken.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "'(' expected after 'foreach' keyword";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		processParseExceptionDebug(e);
		{pos = foreachToken.sourceEnd+1;}
		}
		try {
			expression = Expression();
		 pos = expression.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "variable expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		processParseExceptionDebug(e);
		}
		try {
			asToken = jj_consume_token(AS);
		 pos = asToken.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "'as' expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		processParseExceptionDebug(e);
		}
		try {
			variable = ArrayVariable();
		 pos = variable.sourceEnd+1;
		} catch (ParseException e) {
		if (errorMessage != null) {if (true) throw e;}
		errorMessage = "variable expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		processParseExceptionDebug(e);
		}
		try {
			rparenToken = jj_consume_token(RPAREN);
		 pos = rparenToken.sourceEnd+1;
		} catch (ParseException e) {
		errorMessage = "')' expected after 'foreach' keyword";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		processParseExceptionDebug(e);
		}
		try {
			statement = Statement();
		 pos = statement.sourceEnd+1;
		} catch (ParseException e) {
		if (errorMessage != null) {if (true) throw e;}
		errorMessage = "statement expected";
		errorLevel   = ERROR;
		errorStart = e.currentToken.sourceStart;
		errorEnd   = e.currentToken.sourceEnd;
		processParseExceptionDebug(e);
		}
	 {if (true) return new ForeachStatement(expression,
															 variable,
															 statement,
															 foreachToken.sourceStart,
															 pos);}
		throw new Error("Missing return statement in function");
	}

/**
 * a for declaration.
 * @return a node representing the for statement
 */
	final public ForStatement ForStatement() throws ParseException {
final Token token,tokenEndFor,token2,tokenColon;
int pos;
Expression[] initializations = null;
Expression condition = null;
Expression[] increments = null;
Statement action;
final ArrayList list = new ArrayList();
		token = jj_consume_token(FOR);
		try {
			jj_consume_token(LPAREN);
		} catch (ParseException e) {
		errorMessage = "'(' expected after 'for' keyword";
		errorLevel   = ERROR;
		errorStart = token.sourceEnd;
		errorEnd   = token.sourceEnd +1;
		processParseExceptionDebug(e);
		}
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ARRAY:
		case LIST:
		case PRINT:
		case NEW:
		case NULL:
		case TRUE:
		case FALSE:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
			initializations = ForInit();
			break;
		default:
			jj_la1[119] = jj_gen;
			;
		}
		jj_consume_token(SEMICOLON);
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ARRAY:
		case LIST:
		case PRINT:
		case NEW:
		case NULL:
		case TRUE:
		case FALSE:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
			condition = Expression();
			break;
		default:
			jj_la1[120] = jj_gen;
			;
		}
		jj_consume_token(SEMICOLON);
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ARRAY:
		case LIST:
		case PRINT:
		case NEW:
		case NULL:
		case TRUE:
		case FALSE:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
			increments = StatementExpressionList();
			break;
		default:
			jj_la1[121] = jj_gen;
			;
		}
		jj_consume_token(RPAREN);
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case IF:
		case ARRAY:
		case BREAK:
		case LIST:
		case PRINT:
		case ECHO:
		case INCLUDE:
		case REQUIRE:
		case INCLUDE_ONCE:
		case REQUIRE_ONCE:
		case GLOBAL:
		case DEFINE:
		case STATIC:
		case CONTINUE:
		case DO:
		case FOR:
		case NEW:
		case NULL:
		case RETURN:
		case SWITCH:
		case TRUE:
		case FALSE:
		case WHILE:
		case FOREACH:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
		case LBRACE:
		case SEMICOLON:
			action = Statement();
			 {if (true) return new ForStatement(initializations,
															 condition,
															 increments,
															 action,
															 token.sourceStart,
															 action.sourceEnd);}
			break;
		case COLON:
			tokenColon = jj_consume_token(COLON);
														pos = tokenColon.sourceEnd+1;
			label_38:
			while (true) {
				switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
				case IF:
				case ARRAY:
				case BREAK:
				case LIST:
				case PRINT:
				case ECHO:
				case INCLUDE:
				case REQUIRE:
				case INCLUDE_ONCE:
				case REQUIRE_ONCE:
				case GLOBAL:
				case DEFINE:
				case STATIC:
				case CONTINUE:
				case DO:
				case FOR:
				case NEW:
				case NULL:
				case RETURN:
				case SWITCH:
				case TRUE:
				case FALSE:
				case WHILE:
				case FOREACH:
				case AT:
				case BANG:
				case TILDE:
				case PLUS_PLUS:
				case MINUS_MINUS:
				case PLUS:
				case MINUS:
				case BIT_AND:
				case INTEGER_LITERAL:
				case FLOATING_POINT_LITERAL:
				case STRING_LITERAL:
				case DOUBLEQUOTE:
				case DOLLAR:
				case IDENTIFIER:
				case LPAREN:
				case LBRACE:
				case SEMICOLON:
					;
					break;
				default:
					jj_la1[122] = jj_gen;
					break label_38;
				}
				action = Statement();
														 list.add(action);pos = action.sourceEnd+1;
			}
				try {
				setMarker(fileToParse,
									"Ugly syntax detected, you should for () {...} instead of for (): ... endfor;",
									token.sourceStart,
									token.sourceEnd,
									INFO,
									"Line " + token.beginLine);
				} catch (CoreException e) {
					PHPeclipsePlugin.log(e);
				}
			try {
				tokenEndFor = jj_consume_token(ENDFOR);
				 pos = tokenEndFor.sourceEnd+1;
			} catch (ParseException e) {
				errorMessage = "'endfor' expected";
				errorLevel   = ERROR;
				errorStart = pos;
				errorEnd   = pos;
				processParseExceptionDebug(e);
			}
			try {
				token2 = jj_consume_token(SEMICOLON);
				 pos = token2.sourceEnd+1;
			} catch (ParseException e) {
				errorMessage = "';' expected after 'endfor' keyword";
				errorLevel   = ERROR;
				errorStart = pos;
				errorEnd   = pos;
				processParseExceptionDebug(e);
			}
			final Statement[] stmtsArray = new Statement[list.size()];
			list.toArray(stmtsArray);
			{if (true) return new ForStatement(initializations,
															condition,
															increments,
															new Block(stmtsArray,
																				stmtsArray[0].sourceStart,
																				stmtsArray[stmtsArray.length-1].sourceEnd),
															token.sourceStart,
															pos);}
			break;
		default:
			jj_la1[123] = jj_gen;
			jj_consume_token(-1);
			throw new ParseException();
		}
		throw new Error("Missing return statement in function");
	}

	final public Expression[] ForInit() throws ParseException {
	final Expression[] exprs;
		if (jj_2_5(2147483647)) {
			exprs = LocalVariableDeclaration();
	 {if (true) return exprs;}
		} else {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case ARRAY:
			case LIST:
			case PRINT:
			case NEW:
			case NULL:
			case TRUE:
			case FALSE:
			case AT:
			case BANG:
			case TILDE:
			case PLUS_PLUS:
			case MINUS_MINUS:
			case PLUS:
			case MINUS:
			case BIT_AND:
			case INTEGER_LITERAL:
			case FLOATING_POINT_LITERAL:
			case STRING_LITERAL:
			case DOUBLEQUOTE:
			case DOLLAR:
			case IDENTIFIER:
			case LPAREN:
				exprs = StatementExpressionList();
	 {if (true) return exprs;}
				break;
			default:
				jj_la1[124] = jj_gen;
				jj_consume_token(-1);
				throw new ParseException();
			}
		}
		throw new Error("Missing return statement in function");
	}

	final public Expression[] StatementExpressionList() throws ParseException {
	final ArrayList list = new ArrayList();
	final Expression expr;
		expr = Expression();
												 list.add(expr);
		label_39:
		while (true) {
			switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
			case COMMA:
				;
				break;
			default:
				jj_la1[125] = jj_gen;
				break label_39;
			}
			jj_consume_token(COMMA);
			Expression();
												 list.add(expr);
		}
		final Expression[] exprsArray = new Expression[list.size()];
		list.toArray(exprsArray);
		{if (true) return exprsArray;}
		throw new Error("Missing return statement in function");
	}

	final public Continue ContinueStatement() throws ParseException {
	Expression expr = null;
	final Token token;
	Token token2 = null;
		token = jj_consume_token(CONTINUE);
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ARRAY:
		case LIST:
		case PRINT:
		case NEW:
		case NULL:
		case TRUE:
		case FALSE:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
			expr = Expression();
			break;
		default:
			jj_la1[126] = jj_gen;
			;
		}
		try {
			token2 = jj_consume_token(SEMICOLON);
		} catch (ParseException e) {
		errorMessage = "';' expected after 'continue' statement";
		errorLevel   = ERROR;
		if (expr == null) {
			errorStart = token.sourceEnd+1;
			errorEnd   = token.sourceEnd+1;
		} else {
			errorStart = expr.sourceEnd+1;
			errorEnd   = expr.sourceEnd+1;
		}
		processParseExceptionDebug(e);
		}
		if (token2 == null) {
			if (expr == null) {
				{if (true) return new Continue(expr,token.sourceStart,token.sourceEnd);}
			}
			{if (true) return new Continue(expr,token.sourceStart,expr.sourceEnd);}
		}
		{if (true) return new Continue(expr,token.sourceStart,token2.sourceEnd);}
		throw new Error("Missing return statement in function");
	}

	final public ReturnStatement ReturnStatement() throws ParseException {
	Expression expr = null;
	final Token token;
	Token token2 = null;
		token = jj_consume_token(RETURN);
		switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
		case ARRAY:
		case LIST:
		case PRINT:
		case NEW:
		case NULL:
		case TRUE:
		case FALSE:
		case AT:
		case BANG:
		case TILDE:
		case PLUS_PLUS:
		case MINUS_MINUS:
		case PLUS:
		case MINUS:
		case BIT_AND:
		case INTEGER_LITERAL:
		case FLOATING_POINT_LITERAL:
		case STRING_LITERAL:
		case DOUBLEQUOTE:
		case DOLLAR:
		case IDENTIFIER:
		case LPAREN:
			expr = Expression();
			break;
		default:
			jj_la1[127] = jj_gen;
			;
		}
		try {
			token2 = jj_consume_token(SEMICOLON);
		} catch (ParseException e) {
		errorMessage = "';' expected after 'return' statement";
		errorLevel   = ERROR;
		if (expr == null) {
			errorStart = token.sourceEnd+1;
			errorEnd   = token.sourceEnd+1;
		} else {
			errorStart = expr.sourceEnd+1;
			errorEnd   = expr.sourceEnd+1;
		}
		processParseExceptionDebug(e);
		}
		if (token2 == null) {
			if (expr == null) {
				{if (true) return new ReturnStatement(expr,token.sourceStart,token.sourceEnd);}
			}
			{if (true) return new ReturnStatement(expr,token.sourceStart,expr.sourceEnd);}
		}
		{if (true) return new ReturnStatement(expr,token.sourceStart,token2.sourceEnd);}
		throw new Error("Missing return statement in function");
	}

	final private boolean jj_2_1(int xla) {
		jj_la = xla; jj_lastpos = jj_scanpos = token;
		boolean retval = !jj_3_1();
		jj_save(0, xla);
		return retval;
	}

	final private boolean jj_2_2(int xla) {
		jj_la = xla; jj_lastpos = jj_scanpos = token;
		boolean retval = !jj_3_2();
		jj_save(1, xla);
		return retval;
	}

	final private boolean jj_2_3(int xla) {
		jj_la = xla; jj_lastpos = jj_scanpos = token;
		boolean retval = !jj_3_3();
		jj_save(2, xla);
		return retval;
	}

	final private boolean jj_2_4(int xla) {
		jj_la = xla; jj_lastpos = jj_scanpos = token;
		boolean retval = !jj_3_4();
		jj_save(3, xla);
		return retval;
	}

	final private boolean jj_2_5(int xla) {
		jj_la = xla; jj_lastpos = jj_scanpos = token;
		boolean retval = !jj_3_5();
		jj_save(4, xla);
		return retval;
	}

	final private boolean jj_3R_210() {
		if (jj_3R_116()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_209() {
		if (jj_3R_50()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_109() {
		if (jj_3R_114()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_115()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_208() {
		if (jj_scan_token(IDENTIFIER)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_203() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_208()) {
		jj_scanpos = xsp;
		if (jj_3R_209()) {
		jj_scanpos = xsp;
		if (jj_3R_210()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_110() {
		if (jj_scan_token(BIT_OR)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_109()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_103() {
		if (jj_3R_109()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_110()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_188() {
		if (jj_scan_token(ARRAY)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_198()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_132() {
		if (jj_scan_token(IDENTIFIER)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_106() {
		if (jj_scan_token(DOT)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_103()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_131() {
		if (jj_scan_token(LBRACE)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(RBRACE)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_97() {
		if (jj_3R_103()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_106()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_204() {
		if (jj_3R_207()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_122() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_130()) {
		jj_scanpos = xsp;
		if (jj_3R_131()) {
		jj_scanpos = xsp;
		if (jj_3R_132()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_130() {
		if (jj_scan_token(DOLLAR)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_122()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_108() {
		if (jj_scan_token(_ANDL)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_107() {
		if (jj_scan_token(AND_AND)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_100() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_107()) {
		jj_scanpos = xsp;
		if (jj_3R_108()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_97()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_81() {
		if (jj_3R_97()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_100()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_79() {
		if (jj_scan_token(HOOK)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(COLON)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_73()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_195() {
		if (jj_scan_token(NEW)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_203()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_204()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_68() {
		if (jj_scan_token(DOLLAR)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_122()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_202() {
		if (jj_3R_207()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_194() {
		if (jj_3R_116()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_202()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_102() {
		if (jj_scan_token(_ORL)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_101() {
		if (jj_scan_token(OR_OR)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_83() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_101()) {
		jj_scanpos = xsp;
		if (jj_3R_102()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_81()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3_1() {
		if (jj_3R_40()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_201() {
		if (jj_3R_207()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_76() {
		if (jj_3R_81()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_83()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_51() {
		if (jj_scan_token(COMMA)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_200() {
		if (jj_scan_token(STATICCLASSACCESS)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_203()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_116() {
		if (jj_3R_68()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3_1()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_45() {
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_51()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_193() {
		if (jj_scan_token(IDENTIFIER)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_200()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		xsp = jj_scanpos;
		if (jj_3R_201()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_187() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_193()) {
		jj_scanpos = xsp;
		if (jj_3R_194()) {
		jj_scanpos = xsp;
		if (jj_3R_195()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_73() {
		if (jj_3R_76()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_79()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_178() {
		if (jj_3R_188()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3_5() {
		if (jj_3R_45()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_186() {
		if (jj_scan_token(BIT_AND)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_96() {
		if (jj_scan_token(TILDEEQUAL)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_95() {
		if (jj_scan_token(DOTASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_173() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_177()) {
		jj_scanpos = xsp;
		if (jj_3R_178()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_177() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_186()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_187()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_94() {
		if (jj_scan_token(ORASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_93() {
		if (jj_scan_token(XORASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_92() {
		if (jj_scan_token(ANDASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_91() {
		if (jj_scan_token(RSIGNEDSHIFTASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_90() {
		if (jj_scan_token(LSHIFTASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_89() {
		if (jj_scan_token(MINUSASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_88() {
		if (jj_scan_token(PLUSASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_87() {
		if (jj_scan_token(REMASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_86() {
		if (jj_scan_token(SLASHASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_85() {
		if (jj_scan_token(STARASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_84() {
		if (jj_scan_token(ASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_80() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_84()) {
		jj_scanpos = xsp;
		if (jj_3R_85()) {
		jj_scanpos = xsp;
		if (jj_3R_86()) {
		jj_scanpos = xsp;
		if (jj_3R_87()) {
		jj_scanpos = xsp;
		if (jj_3R_88()) {
		jj_scanpos = xsp;
		if (jj_3R_89()) {
		jj_scanpos = xsp;
		if (jj_3R_90()) {
		jj_scanpos = xsp;
		if (jj_3R_91()) {
		jj_scanpos = xsp;
		if (jj_3R_92()) {
		jj_scanpos = xsp;
		if (jj_3R_93()) {
		jj_scanpos = xsp;
		if (jj_3R_94()) {
		jj_scanpos = xsp;
		if (jj_3R_95()) {
		jj_scanpos = xsp;
		if (jj_3R_96()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_197() {
		if (jj_scan_token(MINUS_MINUS)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_196() {
		if (jj_scan_token(PLUS_PLUS)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_191() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_196()) {
		jj_scanpos = xsp;
		if (jj_3R_197()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_175() {
		if (jj_3R_173()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_191()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_99() {
		if (jj_3R_105()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_98() {
		if (jj_3R_104()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_82() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_98()) {
		jj_scanpos = xsp;
		if (jj_3R_99()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_190() {
		if (jj_scan_token(ARRAY)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_189() {
		if (jj_3R_50()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_78() {
		if (jj_3R_82()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_43() {
		if (jj_scan_token(ARRAY)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_77() {
		if (jj_scan_token(BANG)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_74()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_74() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_77()) {
		jj_scanpos = xsp;
		if (jj_3R_78()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_174() {
		if (jj_scan_token(LPAREN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_189()) {
		jj_scanpos = xsp;
		if (jj_3R_190()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(RPAREN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_144()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_42() {
		if (jj_3R_50()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_58() {
		if (jj_3R_74()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3_3() {
		if (jj_scan_token(LPAREN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_42()) {
		jj_scanpos = xsp;
		if (jj_3R_43()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(RPAREN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_172() {
		if (jj_scan_token(LPAREN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(RPAREN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_171() {
		if (jj_3R_176()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_170() {
		if (jj_3R_175()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_166() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_169()) {
		jj_scanpos = xsp;
		if (jj_3R_170()) {
		jj_scanpos = xsp;
		if (jj_3R_171()) {
		jj_scanpos = xsp;
		if (jj_3R_172()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_169() {
		if (jj_3R_174()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_44() {
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(SEMICOLON)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_168() {
		if (jj_scan_token(MINUS_MINUS)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_167() {
		if (jj_scan_token(PLUS_PLUS)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_75() {
		if (jj_3R_80()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_165() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_167()) {
		jj_scanpos = xsp;
		if (jj_3R_168()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_173()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_49() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_57()) {
		jj_scanpos = xsp;
		if (jj_3R_58()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_57() {
		if (jj_3R_73()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_75()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_67() {
		if (jj_scan_token(OBJECT)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_161() {
		if (jj_3R_166()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_66() {
		if (jj_scan_token(INTEGER)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_65() {
		if (jj_scan_token(INT)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_64() {
		if (jj_scan_token(FLOAT)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_160() {
		if (jj_3R_165()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_63() {
		if (jj_scan_token(DOUBLE)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_62() {
		if (jj_scan_token(REAL)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_61() {
		if (jj_scan_token(BOOLEAN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_60() {
		if (jj_scan_token(BOOL)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_159() {
		if (jj_scan_token(MINUS)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_148()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_50() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_59()) {
		jj_scanpos = xsp;
		if (jj_3R_60()) {
		jj_scanpos = xsp;
		if (jj_3R_61()) {
		jj_scanpos = xsp;
		if (jj_3R_62()) {
		jj_scanpos = xsp;
		if (jj_3R_63()) {
		jj_scanpos = xsp;
		if (jj_3R_64()) {
		jj_scanpos = xsp;
		if (jj_3R_65()) {
		jj_scanpos = xsp;
		if (jj_3R_66()) {
		jj_scanpos = xsp;
		if (jj_3R_67()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_59() {
		if (jj_scan_token(STRING)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_156() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_158()) {
		jj_scanpos = xsp;
		if (jj_3R_159()) {
		jj_scanpos = xsp;
		if (jj_3R_160()) {
		jj_scanpos = xsp;
		if (jj_3R_161()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_158() {
		if (jj_scan_token(PLUS)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_148()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3_4() {
		if (jj_3R_44()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_164() {
		if (jj_3R_156()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_163() {
		if (jj_scan_token(BANG)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_157()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_157() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_162()) {
		jj_scanpos = xsp;
		if (jj_3R_163()) {
		jj_scanpos = xsp;
		if (jj_3R_164()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_162() {
		if (jj_scan_token(AT)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_157()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_155() {
		if (jj_3R_156()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_216() {
		if (jj_scan_token(COMMA)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_154() {
		if (jj_scan_token(BANG)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_157()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_215() {
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_216()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_153() {
		if (jj_scan_token(TILDE)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_148()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_148() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_152()) {
		jj_scanpos = xsp;
		if (jj_3R_153()) {
		jj_scanpos = xsp;
		if (jj_3R_154()) {
		jj_scanpos = xsp;
		if (jj_3R_155()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_152() {
		if (jj_scan_token(AT)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_148()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_213() {
		if (jj_3R_215()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_144() {
		if (jj_3R_148()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_151() {
		if (jj_scan_token(REMAINDER)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_150() {
		if (jj_scan_token(SLASH)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_149() {
		if (jj_scan_token(STAR)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_207() {
		if (jj_scan_token(LPAREN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_213()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(RPAREN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_145() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_149()) {
		jj_scanpos = xsp;
		if (jj_3R_150()) {
		jj_scanpos = xsp;
		if (jj_3R_151()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_144()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_139() {
		if (jj_3R_144()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_145()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_212() {
		if (jj_scan_token(LBRACE1)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(ID)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(RBRACE1)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_147() {
		if (jj_scan_token(MINUS)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_211() {
		if (jj_scan_token(IDENTIFIER)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_146() {
		if (jj_scan_token(PLUS)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_140() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_146()) {
		jj_scanpos = xsp;
		if (jj_3R_147()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_139()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_199() {
		if (jj_scan_token(DOLLARS)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_211()) {
		jj_scanpos = xsp;
		if (jj_3R_212()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_133() {
		if (jj_3R_139()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_140()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_192() {
		if (jj_scan_token(DOUBLEQUOTE)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_199()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		if (jj_scan_token(DOUBLEQUOTE2)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_113() {
		if (jj_scan_token(ASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_143() {
		if (jj_scan_token(RUNSIGNEDSHIFT)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_142() {
		if (jj_scan_token(RSIGNEDSHIFT)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_141() {
		if (jj_scan_token(LSHIFT)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_185() {
		if (jj_3R_192()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_184() {
		if (jj_scan_token(NULL)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_134() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_141()) {
		jj_scanpos = xsp;
		if (jj_3R_142()) {
		jj_scanpos = xsp;
		if (jj_3R_143()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_133()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_183() {
		if (jj_scan_token(FALSE)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_182() {
		if (jj_scan_token(TRUE)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_123() {
		if (jj_3R_133()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_134()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_181() {
		if (jj_scan_token(STRING_LITERAL)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_180() {
		if (jj_scan_token(FLOATING_POINT_LITERAL)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_117() {
		if (jj_3R_116()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_179() {
		if (jj_scan_token(INTEGER_LITERAL)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_176() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_179()) {
		jj_scanpos = xsp;
		if (jj_3R_180()) {
		jj_scanpos = xsp;
		if (jj_3R_181()) {
		jj_scanpos = xsp;
		if (jj_3R_182()) {
		jj_scanpos = xsp;
		if (jj_3R_183()) {
		jj_scanpos = xsp;
		if (jj_3R_184()) {
		jj_scanpos = xsp;
		if (jj_3R_185()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_138() {
		if (jj_scan_token(GE)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_137() {
		if (jj_scan_token(LE)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_136() {
		if (jj_scan_token(GT)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_112() {
		if (jj_scan_token(COMMA)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_117()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_135() {
		if (jj_scan_token(LT)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_124() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_135()) {
		jj_scanpos = xsp;
		if (jj_3R_136()) {
		jj_scanpos = xsp;
		if (jj_3R_137()) {
		jj_scanpos = xsp;
		if (jj_3R_138()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_123()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_120() {
		if (jj_3R_123()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_124()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_111() {
		if (jj_3R_116()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_72() {
		if (jj_3R_50()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_71() {
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_56() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_71()) {
		jj_scanpos = xsp;
		if (jj_3R_72()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_48() {
		if (jj_scan_token(LBRACE)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_56()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(RBRACE)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_104() {
		if (jj_scan_token(LIST)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(LPAREN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_111()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_112()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		if (jj_scan_token(RPAREN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		xsp = jj_scanpos;
		if (jj_3R_113()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_206() {
		if (jj_scan_token(COMMA)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_70() {
		if (jj_3R_50()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3_2() {
		if (jj_scan_token(COMMA)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_41()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_55() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_69()) {
		jj_scanpos = xsp;
		if (jj_3R_70()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_69() {
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_205() {
		if (jj_3R_41()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3_2()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_47() {
		if (jj_scan_token(LBRACKET)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_55()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(RBRACKET)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_129() {
		if (jj_scan_token(TRIPLEEQUAL)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_128() {
		if (jj_scan_token(BANGDOUBLEEQUAL)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_127() {
		if (jj_scan_token(NOT_EQUAL)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_126() {
		if (jj_scan_token(DIF)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_105() {
		if (jj_scan_token(PRINT)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_198() {
		if (jj_scan_token(LPAREN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_205()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		xsp = jj_scanpos;
		if (jj_3R_206()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(RPAREN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_125() {
		if (jj_scan_token(EQUAL_EQUAL)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_54() {
		if (jj_3R_68()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_121() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_125()) {
		jj_scanpos = xsp;
		if (jj_3R_126()) {
		jj_scanpos = xsp;
		if (jj_3R_127()) {
		jj_scanpos = xsp;
		if (jj_3R_128()) {
		jj_scanpos = xsp;
		if (jj_3R_129()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_120()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_53() {
		if (jj_scan_token(IDENTIFIER)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_118() {
		if (jj_3R_120()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_121()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_214() {
		if (jj_scan_token(ARRAYASSIGN)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_52() {
		if (jj_scan_token(LBRACE)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_scan_token(RBRACE)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_41() {
		if (jj_3R_49()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_214()) jj_scanpos = xsp;
		else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_119() {
		if (jj_scan_token(BIT_AND)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_118()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_46() {
		if (jj_scan_token(CLASSACCESS)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_52()) {
		jj_scanpos = xsp;
		if (jj_3R_53()) {
		jj_scanpos = xsp;
		if (jj_3R_54()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_40() {
		Token xsp;
		xsp = jj_scanpos;
		if (jj_3R_46()) {
		jj_scanpos = xsp;
		if (jj_3R_47()) {
		jj_scanpos = xsp;
		if (jj_3R_48()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		} else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	final private boolean jj_3R_114() {
		if (jj_3R_118()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		Token xsp;
		while (true) {
			xsp = jj_scanpos;
			if (jj_3R_119()) { jj_scanpos = xsp; break; }
			if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		}
		return false;
	}

	final private boolean jj_3R_115() {
		if (jj_scan_token(XOR)) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		if (jj_3R_114()) return true;
		if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
		return false;
	}

	public PHPParserTokenManager token_source;
	SimpleCharStream jj_input_stream;
	public Token token, jj_nt;
	private int jj_ntk;
	private Token jj_scanpos, jj_lastpos;
	private int jj_la;
	public boolean lookingAhead = false;
	private boolean jj_semLA;
	private int jj_gen;
	final private int[] jj_la1 = new int[128];
	static private int[] jj_la1_0;
	static private int[] jj_la1_1;
	static private int[] jj_la1_2;
	static private int[] jj_la1_3;
	static private int[] jj_la1_4;
	static {
			jj_la1_0();
			jj_la1_1();
			jj_la1_2();
			jj_la1_3();
			jj_la1_4();
	 }
	 private static void jj_la1_0() {
			jj_la1_0 = new int[] {0x5800001e,0x6,0x6,0x5800001e,0x0,0x58000000,0x0,0x30000000,0x30000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000000,0x40000000,0x8,0x6,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x58000010,0x58000010,0x58000000,0x58000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x58000010,0x58000010,0x0,0x0,0x40000010,0x40000010,0x80000000,0x0,0x40000010,0x80000000,0x0,0x40000010,0x40000010,0x40000010,0x40000010,0x40000010,0x40000000,0x40000000,0x0,0x0,0x0,0x40000000,0x40000000,0x0,0x0,0x0,0x0,};
	 }
	 private static void jj_la1_1() {
			jj_la1_1 = new int[] {0xd7541ffe,0x0,0x0,0xd7541ffe,0x0,0xd7541ffe,0x200000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc2000002,0x8000,0xc300001a,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc300001a,0x18,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc3000002,0xc3000002,0xc3000002,0x0,0xc3000002,0x2,0x0,0x0,0x0,0x1000002,0x4000,0x0,0x0,0x0,0x1000000,0x0,0x0,0xc300001a,0xc300001a,0xc300001a,0xc300001a,0x2000,0xc2000000,0x0,0x0,0xc300001a,0x0,0x0,0x14541fe0,0xd7541ffe,0x0,0x0,0x3c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xd7541ffe,0xd7541ffe,0xd7541ffe,0xd7541ffa,0x0,0x0,0x0,0x0,0x1000002,0x0,0x90000,0x90000,0xd7541ffe,0xd7541ffe,0x90000,0xc300001a,0xd7541ffe,0xd7541ffe,0x0,0x1,0xd7541ffe,0x0,0x1,0xd7541ffe,0xd7541ffe,0xd7541ffe,0xd7541ffe,0xd7541ffe,0xd7541ffe,0xd7541ffe,0xc300001a,0xc300001a,0xc300001a,0xd7541ffe,0xd7541ffe,0xc300001a,0x0,0xc300001a,0xc300001a,};
	 }
	 private static void jj_la1_2() {
			jj_la1_2 = new int[] {0x27870021,0x0,0x0,0x27870021,0x0,0x27870021,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x6000000,0x0,0x27870000,0x0,0x20000000,0x0,0x20000000,0x20000000,0xff80,0x0,0x27870000,0x20000,0x0,0x0,0x80000,0x200000,0x200000,0x400000,0x400000,0x0,0x40000000,0x80000000,0x20000000,0x0,0x0,0x0,0x0,0x0,0x0,0x6000000,0x6000000,0x18000000,0x18000000,0x27870000,0x27830000,0x27800000,0x1800000,0x20000000,0xff80,0x1800000,0x1800000,0x20000000,0x20000000,0x0,0x0,0x0,0x0,0x0,0xff80,0x0,0x2787ff80,0x2787ff80,0x2787ff80,0x2787ff80,0x0,0x0,0x0,0x0,0x27870000,0x0,0x10000,0x10021,0x27870021,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x27870021,0x27870021,0x27870021,0x27870021,0x0,0x0,0x1800000,0x1800000,0x21800000,0x100000,0x0,0x0,0x27870021,0x27870021,0x0,0x27870000,0x27870021,0x27870021,0x0,0x0,0x27870021,0x0,0x0,0x27970021,0x27870021,0x27870021,0x27870021,0x27870021,0x27870021,0x27970021,0x27870000,0x27870000,0x27870000,0x27870021,0x27970021,0x27870000,0x0,0x27870000,0x27870000,};
	 }
	 private static void jj_la1_3() {
			jj_la1_3 = new int[] {0x18011440,0x0,0x0,0x18011440,0x0,0x18011440,0x0,0x0,0x0,0x0,0x10000000,0x0,0x0,0x18000000,0x440,0x440,0x10011440,0x0,0x18011440,0x0,0x0,0x0,0x8000000,0x0,0x0,0x0,0x18011440,0x0,0x0,0x0,0x0,0x10,0x10,0x20,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xe,0xe,0x0,0x0,0x1,0x1,0x18011440,0x18011440,0x18011440,0x0,0x18011440,0x0,0x0,0x0,0x0,0x18000000,0x0,0x0,0x0,0x0,0x18000000,0x18000000,0x18000000,0x18011440,0x18011440,0x18011440,0x18011440,0x0,0x11440,0x20000,0x10080000,0x18011440,0x0,0x0,0x10000000,0x18011440,0x0,0x0,0x0,0x8000000,0x0,0x8000000,0x0,0x0,0x0,0x0,0x18011440,0x18011440,0x18011440,0x18011440,0x0,0x0,0x0,0x0,0x18000000,0x0,0x0,0x0,0x18011440,0x18011440,0x0,0x18011440,0x18011440,0x18011440,0x0,0x0,0x18011440,0x0,0x0,0x18011440,0x18011440,0x18011440,0x18011440,0x18011440,0x18011440,0x18011440,0x18011440,0x18011440,0x18011440,0x18011440,0x18011440,0x18011440,0x0,0x18011440,0x18011440,};
	 }
	 private static void jj_la1_4() {
			jj_la1_4 = new int[] {0x8a,0x0,0x0,0x8a,0x80,0x8a,0x0,0x0,0x0,0x100,0x8,0x80000,0x80000,0x8,0x0,0x0,0x0,0x0,0x2,0x100,0x0,0x100,0x0,0x0,0x0,0xfff80000,0x2,0x0,0x0,0xfff80000,0x0,0x0,0x0,0x0,0x0,0x200,0x0,0x0,0x0,0x79000,0x79000,0x6c00,0x6c00,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x2,0x2,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x2,0x2,0x0,0x0,0x8,0x2,0x2,0x2,0x2,0x28,0x0,0x0,0x0,0x2,0x100,0x0,0x88,0x8a,0x0,0x0,0x0,0x0,0x100,0x0,0x80000,0x100,0x100,0x100,0x8a,0x8a,0x8a,0x8a,0x100,0x80000,0x0,0x0,0x0,0x8,0x0,0x0,0x8a,0x8a,0x0,0x2,0x8a,0x8a,0x0,0x0,0x8a,0x0,0x0,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x2,0x2,0x2,0x8a,0x8a,0x2,0x100,0x2,0x2,};
	 }
	final private JJCalls[] jj_2_rtns = new JJCalls[5];
	private boolean jj_rescan = false;
	private int jj_gc = 0;

	public PHPParser(java.io.InputStream stream) {
		jj_input_stream = new SimpleCharStream(stream, 1, 1);
		token_source = new PHPParserTokenManager(jj_input_stream);
		token = new Token();
		jj_ntk = -1;
		jj_gen = 0;
		for (int i = 0; i < 128; i++) jj_la1[i] = -1;
		for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
	}

	public void ReInit(java.io.InputStream stream) {
		jj_input_stream.ReInit(stream, 1, 1);
		token_source.ReInit(jj_input_stream);
		token = new Token();
		jj_ntk = -1;
		jj_gen = 0;
		for (int i = 0; i < 128; i++) jj_la1[i] = -1;
		for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
	}

	public PHPParser(java.io.Reader stream) {
		jj_input_stream = new SimpleCharStream(stream, 1, 1);
		token_source = new PHPParserTokenManager(jj_input_stream);
		token = new Token();
		jj_ntk = -1;
		jj_gen = 0;
		for (int i = 0; i < 128; i++) jj_la1[i] = -1;
		for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
	}

	public void ReInit(java.io.Reader stream) {
		jj_input_stream.ReInit(stream, 1, 1);
		token_source.ReInit(jj_input_stream);
		token = new Token();
		jj_ntk = -1;
		jj_gen = 0;
		for (int i = 0; i < 128; i++) jj_la1[i] = -1;
		for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
	}

	public PHPParser(PHPParserTokenManager tm) {
		token_source = tm;
		token = new Token();
		jj_ntk = -1;
		jj_gen = 0;
		for (int i = 0; i < 128; i++) jj_la1[i] = -1;
		for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
	}

	public void ReInit(PHPParserTokenManager tm) {
		token_source = tm;
		token = new Token();
		jj_ntk = -1;
		jj_gen = 0;
		for (int i = 0; i < 128; i++) jj_la1[i] = -1;
		for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
	}

	final private Token jj_consume_token(int kind) throws ParseException {
		Token oldToken;
		if ((oldToken = token).next != null) token = token.next;
		else token = token.next = token_source.getNextToken();
		jj_ntk = -1;
		if (token.kind == kind) {
			jj_gen++;
			if (++jj_gc > 100) {
				jj_gc = 0;
				for (int i = 0; i < jj_2_rtns.length; i++) {
					JJCalls c = jj_2_rtns[i];
					while (c != null) {
						if (c.gen < jj_gen) c.first = null;
						c = c.next;
					}
				}
			}
			return token;
		}
		token = oldToken;
		jj_kind = kind;
		throw generateParseException();
	}

	final private boolean jj_scan_token(int kind) {
		if (jj_scanpos == jj_lastpos) {
			jj_la--;
			if (jj_scanpos.next == null) {
				jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
			} else {
				jj_lastpos = jj_scanpos = jj_scanpos.next;
			}
		} else {
			jj_scanpos = jj_scanpos.next;
		}
		if (jj_rescan) {
			int i = 0; Token tok = token;
			while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
			if (tok != null) jj_add_error_token(kind, i);
		}
		return (jj_scanpos.kind != kind);
	}

	final public Token getNextToken() {
		if (token.next != null) token = token.next;
		else token = token.next = token_source.getNextToken();
		jj_ntk = -1;
		jj_gen++;
		return token;
	}

	final public Token getToken(int index) {
		Token t = lookingAhead ? jj_scanpos : token;
		for (int i = 0; i < index; i++) {
			if (t.next != null) t = t.next;
			else t = t.next = token_source.getNextToken();
		}
		return t;
	}

	final private int jj_ntk() {
		if ((jj_nt=token.next) == null)
			return (jj_ntk = (token.next=token_source.getNextToken()).kind);
		else
			return (jj_ntk = jj_nt.kind);
	}

	private java.util.Vector jj_expentries = new java.util.Vector();
	private int[] jj_expentry;
	private int jj_kind = -1;
	private int[] jj_lasttokens = new int[100];
	private int jj_endpos;

	private void jj_add_error_token(int kind, int pos) {
		if (pos >= 100) return;
		if (pos == jj_endpos + 1) {
			jj_lasttokens[jj_endpos++] = kind;
		} else if (jj_endpos != 0) {
			jj_expentry = new int[jj_endpos];
			for (int i = 0; i < jj_endpos; i++) {
				jj_expentry[i] = jj_lasttokens[i];
			}
			boolean exists = false;
			for (java.util.Enumeration enum = jj_expentries.elements(); enum.hasMoreElements();) {
				int[] oldentry = (int[])(enum.nextElement());
				if (oldentry.length == jj_expentry.length) {
					exists = true;
					for (int i = 0; i < jj_expentry.length; i++) {
						if (oldentry[i] != jj_expentry[i]) {
							exists = false;
							break;
						}
					}
					if (exists) break;
				}
			}
			if (!exists) jj_expentries.addElement(jj_expentry);
			if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
		}
	}

	public ParseException generateParseException() {
		jj_expentries.removeAllElements();
		boolean[] la1tokens = new boolean[160];
		for (int i = 0; i < 160; i++) {
			la1tokens[i] = false;
		}
		if (jj_kind >= 0) {
			la1tokens[jj_kind] = true;
			jj_kind = -1;
		}
		for (int i = 0; i < 128; i++) {
			if (jj_la1[i] == jj_gen) {
				for (int j = 0; j < 32; j++) {
					if ((jj_la1_0[i] & (1<<j)) != 0) {
						la1tokens[j] = true;
					}
					if ((jj_la1_1[i] & (1<<j)) != 0) {
						la1tokens[32+j] = true;
					}
					if ((jj_la1_2[i] & (1<<j)) != 0) {
						la1tokens[64+j] = true;
					}
					if ((jj_la1_3[i] & (1<<j)) != 0) {
						la1tokens[96+j] = true;
					}
					if ((jj_la1_4[i] & (1<<j)) != 0) {
						la1tokens[128+j] = true;
					}
				}
			}
		}
		for (int i = 0; i < 160; i++) {
			if (la1tokens[i]) {
				jj_expentry = new int[1];
				jj_expentry[0] = i;
				jj_expentries.addElement(jj_expentry);
			}
		}
		jj_endpos = 0;
		jj_rescan_token();
		jj_add_error_token(0, 0);
		int[][] exptokseq = new int[jj_expentries.size()][];
		for (int i = 0; i < jj_expentries.size(); i++) {
			exptokseq[i] = (int[])jj_expentries.elementAt(i);
		}
		return new ParseException(token, exptokseq, tokenImage);
	}

	final public void enable_tracing() {
	}

	final public void disable_tracing() {
	}

	final private void jj_rescan_token() {
		jj_rescan = true;
		for (int i = 0; i < 5; i++) {
			JJCalls p = jj_2_rtns[i];
			do {
				if (p.gen > jj_gen) {
					jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
					switch (i) {
						case 0: jj_3_1(); break;
						case 1: jj_3_2(); break;
						case 2: jj_3_3(); break;
						case 3: jj_3_4(); break;
						case 4: jj_3_5(); break;
					}
				}
				p = p.next;
			} while (p != null);
		}
		jj_rescan = false;
	}

	final private void jj_save(int index, int xla) {
		JJCalls p = jj_2_rtns[index];
		while (p.gen > jj_gen) {
			if (p.next == null) { p = p.next = new JJCalls(); break; }
			p = p.next;
		}
		p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
	}

	static final class JJCalls {
		int gen;
		Token first;
		int arg;
		JJCalls next;
	}

}