From 76cc2f45c79ca94724588bf6c8fd9a88583940bf Mon Sep 17 00:00:00 2001 From: khartlage Date: Tue, 2 Mar 2004 21:04:50 +0000 Subject: [PATCH] improved parser keywords abstract, final, public, protected, privatem,.. --- .../phpdt/internal/compiler/parser/Parser.java | 2090 +++++++++++--------- 1 files changed, 1201 insertions(+), 889 deletions(-) diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java index 024bb56..9567e32 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java @@ -1,24 +1,22 @@ /********************************************************************** -Copyright (c) 2002 Klaus Hartlage - www.eclipseproject.de -All rights reserved. This program and the accompanying materials -are made available under the terms of the Common Public License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/legal/cpl-v10.html - -Contributors: - Klaus Hartlage - www.eclipseproject.de -**********************************************************************/ + Copyright (c) 2002 Klaus Hartlage - www.eclipseproject.de + All rights reserved. This program and the accompanying materials + are made available under the terms of the Common Public License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/legal/cpl-v10.html + + Contributors: + Klaus Hartlage - www.eclipseproject.de + **********************************************************************/ package net.sourceforge.phpdt.internal.compiler.parser; - import java.util.ArrayList; - import net.sourceforge.phpdt.core.compiler.CharOperation; import net.sourceforge.phpdt.core.compiler.ITerminalSymbols; import net.sourceforge.phpdt.core.compiler.InvalidInputException; import net.sourceforge.phpdt.internal.compiler.impl.ReferenceContext; +import net.sourceforge.phpdt.internal.compiler.lookup.CompilerModifiers; import net.sourceforge.phpdt.internal.compiler.lookup.TypeConstants; import net.sourceforge.phpdt.internal.compiler.problem.ProblemReporter; -import net.sourceforge.phpeclipse.PHPeclipsePlugin; import net.sourceforge.phpeclipse.internal.compiler.ast.AbstractMethodDeclaration; import net.sourceforge.phpeclipse.internal.compiler.ast.AstNode; import net.sourceforge.phpeclipse.internal.compiler.ast.CompilationUnitDeclaration; @@ -26,137 +24,47 @@ import net.sourceforge.phpeclipse.internal.compiler.ast.MethodDeclaration; import net.sourceforge.phpeclipse.internal.compiler.ast.SingleTypeReference; import net.sourceforge.phpeclipse.internal.compiler.ast.TypeDeclaration; import net.sourceforge.phpeclipse.phpeditor.PHPString; - import org.eclipse.core.resources.IFile; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.jface.preference.IPreferenceStore; - -import test.PHPParserSuperclass; - -public class Parser extends PHPParserSuperclass implements ITerminalSymbols, ParserBasicInformation { - //internal data for the automat +public class Parser //extends PHPParserSuperclass + implements ITerminalSymbols, CompilerModifiers, ParserBasicInformation { + //internal data for the automat protected final static int StackIncrement = 255; protected int stateStackTop; protected int[] stack = new int[StackIncrement]; public int firstToken; // handle for multiple parsing goals public int lastAct; //handle for multiple parsing goals protected RecoveredElement currentElement; - public static boolean VERBOSE_RECOVERY = false; - protected boolean diet = false; //tells the scanner to jump over some parts of the code/expressions like method bodies - + protected boolean diet = false; //tells the scanner to jump over some + // parts of the code/expressions like + // method bodies //scanner token public Scanner scanner; - private ArrayList phpList; - private int currentPHPString; private boolean phpEnd; - // private static HashMap keywordMap = null; private String str; - // current character // char ch; // current token int token; - // row counter for syntax errors: //int rowCount; // column counter for syntax errors: //int columnCount; - //int chIndx; // // // current identifier // String identifier; - Long longNumber; Double doubleNumber; - private String stringValue; - /** Contains the current expression. */ // private StringBuffer expression; - private boolean phpMode; - - // final static int TokenNameEOF = 0; - // final static int TokenNameERROR = 1; - // final static int TokenNameHTML = 2; - // - // final static int TokenNameREMAINDER = 30; - // final static int TokenNameNOT = 31; - // final static int TokenNameDOT = 32; - // final static int TokenNameXOR = 33; - // final static int TokenNameDIVIDE = 34; - // final static int TokenNameMULTIPLY = 35; - // final static int TokenNameMINUS = 36; - // final static int TokenNamePLUS = 37; - // final static int TokenNameEQUAL_EQUAL = 38; - // final static int TokenNameNOT_EQUAL = 39; - // final static int TokenNameGREATER = 40; - // final static int TokenNameGREATER_EQUAL = 41; - // final static int TokenNameLESS = 42; - // final static int TokenNameLESS_EQUAL = 43; - // final static int TokenNameAND_AND = 44; - // final static int TokenNameOR_OR = 45; - // // final static int TokenNameHASH = 46; - // final static int TokenNameCOLON = 47; - // final static int TokenNameDOT_EQUAL = 48; - // - // final static int TokenNameEQUAL = 49; - // final static int TokenNameMINUS_GREATER = 50; // -> - // final static int TokenNameFOREACH = 51; - // final static int TokenNameAND = 52; - // //final static int TokenNameDOLLARLISTOPEN = 53; - // final static int TokenNameTWIDDLE = 54; - // final static int TokenNameTWIDDLE_EQUAL = 55; - // final static int TokenNameREMAINDER_EQUAL = 56; - // final static int TokenNameXOR_EQUAL = 57; - // final static int TokenNameRIGHT_SHIFT_EQUAL = 58; - // final static int TokenNameLEFT_SHIFT_EQUAL = 59; - // final static int TokenNameAND_EQUAL = 60; - // final static int TokenNameOR_EQUAL = 61; - // final static int TokenNameQUESTION = 62; - // final static int TokenNameCOLON_COLON = 63; - // final static int TokenNameAT = 63; - // // final static int TokenNameHEREDOC = 64; - // - // final static int TokenNameDOLLAROPEN = 127; - // final static int TokenNameLPAREN = 128; - // final static int TokenNameRPAREN = 129; - // final static int TokenNameLBRACE = 130; - // final static int TokenNameRBRACE = 131; - // final static int TokenNameLBRACKET = 132; - // final static int TokenNameRBRACKET = 133; - // final static int TokenNameCOMMA = 134; - // - // final static int TokenNameStringLiteral = 136; - // final static int TokenNameIdentifier = 138; - // // final static int TokenNameDIGIT = 139; - // final static int TokenNameSEMICOLON = 140; - // // final static int TokenNameSLOT = 141; - // // final static int TokenNameSLOTSEQUENCE = 142; - // final static int TokenNameMINUS_MINUS = 144; - // final static int TokenNamePLUS_PLUS = 145; - // final static int TokenNamePLUS_EQUAL = 146; - // final static int TokenNameDIVIDE_EQUAL = 147; - // final static int TokenNameMINUS_EQUAL = 148; - // final static int TokenNameMULTIPLY_EQUAL = 149; - // final static int TokenNameVariable = 150; - // final static int TokenNameIntegerLiteral = 151; - // final static int TokenNameDoubleLiteral = 152; - // final static int TokenNameStringInterpolated = 153; - // final static int TokenNameStringConstant = 154; - // - // final static int TokenNameLEFT_SHIFT = 155; - // final static int TokenNameRIGHT_SHIFT = 156; - // final static int TokenNameEQUAL_EQUAL_EQUAL = 157; - // final static int TokenNameNOT_EQUAL_EQUAL = 158; - // final static int TokenNameOR = 159; - // final static int TokenNameAT = 153; // @ - + protected int modifiers; + protected int modifiersSourceStart; protected Parser() { this.currentPHPString = 0; // PHPParserSuperclass.fileToParse = fileToParse; @@ -168,14 +76,11 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // this.columnCount = 0; this.phpEnd = false; // getNextToken(); - this.initializeScanner(); } - - public void setFileToParse(IFile fileToParse) { this.currentPHPString = 0; - PHPParserSuperclass.fileToParse = fileToParse; + // PHPParserSuperclass.fileToParse = fileToParse; this.phpList = null; this.str = ""; this.token = TokenNameEOF; @@ -183,11 +88,12 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par this.initializeScanner(); } /** - * ClassDeclaration Constructor. - * - *@param s - *@param sess Description of Parameter - *@see + * ClassDeclaration Constructor. + * + * @param s + * @param sess + * Description of Parameter + * @see */ public Parser(IFile fileToParse) { // if (keywordMap == null) { @@ -197,7 +103,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // } // } this.currentPHPString = 0; - PHPParserSuperclass.fileToParse = fileToParse; + // PHPParserSuperclass.fileToParse = fileToParse; this.phpList = null; this.str = ""; this.token = TokenNameEOF; @@ -206,50 +112,63 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // this.columnCount = 0; this.phpEnd = false; // getNextToken(); - this.initializeScanner(); } - public void initializeScanner() { this.scanner = new Scanner(false, false, false, false); } /** * Create marker for the parse error */ -// private void setMarker(String message, int charStart, int charEnd, int errorLevel) throws CoreException { -// setMarker(fileToParse, message, charStart, charEnd, errorLevel); -// } - + // private void setMarker(String message, int charStart, int charEnd, int + // errorLevel) { + // setMarker(fileToParse, message, charStart, charEnd, errorLevel); + // } /** - * This method will throw the SyntaxError. - * It will add the good lines and columns to the Error - * @param error the error message - * @throws SyntaxError the error raised + * This method will throw the SyntaxError. It will add the good lines and + * columns to the Error + * + * @param error + * the error message + * @throws SyntaxError + * the error raised */ private void throwSyntaxError(String error) { - int problemStartPosition = scanner.getCurrentTokenStartPosition(); - int problemEndPosition = scanner.getCurrentTokenEndPosition(); - reportSyntaxError(error,problemStartPosition,problemEndPosition); + int problemStartPosition = scanner.getCurrentTokenStartPosition(); + int problemEndPosition = scanner.getCurrentTokenEndPosition(); + throwSyntaxError(error, problemStartPosition, problemEndPosition); } - /** - * This method will throw the SyntaxError. - * It will add the good lines and columns to the Error - * @param error the error message - * @throws SyntaxError the error raised + * This method will throw the SyntaxError. It will add the good lines and + * columns to the Error + * + * @param error + * the error message + * @throws SyntaxError + * the error raised */ -// private void throwSyntaxError(String error, int startRow) { -// throw new SyntaxError(startRow, 0, " ", error); -// } - - private void reportSyntaxError(String error, int problemStartPosition, int problemEndPosition) { - problemReporter.phpParsingError(new String[] { error }, problemStartPosition, problemEndPosition, referenceContext, compilationUnit.compilationResult); + // private void throwSyntaxError(String error, int startRow) { + // throw new SyntaxError(startRow, 0, " ", error); + // } + private void throwSyntaxError(String error, int problemStartPosition, + int problemEndPosition) { + problemReporter + .phpParsingError(new String[]{error}, problemStartPosition, + problemEndPosition, referenceContext, + compilationUnit.compilationResult); throw new SyntaxError(1, 0, " ", error); } + private void reportSyntaxError(String error, int problemStartPosition, + int problemEndPosition) { + problemReporter + .phpParsingError(new String[]{error}, problemStartPosition, + problemEndPosition, referenceContext, + compilationUnit.compilationResult); + } /** - * Method Declaration. - * - *@see + * Method Declaration. + * + * @see */ // private void getChar() { // if (str.length() > chIndx) { @@ -260,36 +179,33 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // // chIndx = str.length() + 1; // ch = ' '; - // // token = TokenNameEOF; + // // token = TokenNameEOF; // phpEnd = true; // } - /** * gets the next token from input */ - private void getNextToken() throws CoreException { + private void getNextToken() { try { token = scanner.getNextToken(); if (Scanner.DEBUG) { int currentEndPosition = scanner.getCurrentTokenEndPosition(); int currentStartPosition = scanner.getCurrentTokenStartPosition(); - - System.out.print(currentStartPosition + "," + currentEndPosition + ": "); + System.out + .print(currentStartPosition + "," + currentEndPosition + ": "); System.out.println(scanner.toStringAction(token)); } } catch (InvalidInputException e) { token = TokenNameERROR; } return; - } - /** - * Get a number. - * if it's a double the number will be stored in doubleNumber and the token will have the - * value {@link Parser#TokenNameDOUBLE_NUMBER}
- * if it's a double the number will be stored in longNumber and the token will have the - * value {@link Parser#TokenNameINT_NUMBER} + * Get a number. if it's a double the number will be stored in + * doubleNumber and the token will have the value + * {@link Parser#TokenNameDOUBLE_NUMBER}
+ * if it's a double the number will be stored in longNumber + * and the token will have the value {@link Parser#TokenNameINT_NUMBER} */ // private void getNumber() { // StringBuffer inum = new StringBuffer(); @@ -384,7 +300,8 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // /** // * Get a String. // * @param openChar the opening char ('\'', '"', '`') - // * @param typeString the type of string {@link #TokenNameSTRING_CONSTANT},{@link #TokenNameINTERPOLATED_STRING} + // * @param typeString the type of string {@link + // #TokenNameSTRING_CONSTANT},{@link #TokenNameINTERPOLATED_STRING} // * @param errorMsg the error message in case of parse error in the string // */ // private void getString( @@ -422,7 +339,6 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // token = typeString; // stringValue = sBuffer.toString(); // } - // public void htmlParserTester(String input) { // int lineNumber = 1; // int startLineNumber = 1; @@ -614,26 +530,25 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // input.substring(startIndex, i - 2), // startLineNumber)); // } - // // for (int j=0;j"); - // // } + // // for (int j=0;j"); + // // } // phpParserTester(null, 1); - // // PHPString temp; - // // for(int j=0;j TokenNameKEYWORD) { - current.add(new PHPVarDeclaration(current, variableName, - // chIndx - ident.length, - scanner.getCurrentTokenStartPosition(), new String(ident))); - } else { - switch (token) { - case TokenNameVariable : - case TokenNamethis : - current.add(new PHPVarDeclaration(current, variableName, - // chIndx - ident.length, - scanner.getCurrentTokenStartPosition(), new String(ident))); - break; - case TokenNameIdentifier : - current.add(new PHPVarDeclaration(current, variableName, - // chIndx - ident.length, - scanner.getCurrentTokenStartPosition(), new String(ident))); - break; - case TokenNameDoubleLiteral : - current.add(new PHPVarDeclaration(current, variableName + doubleNumber, - // chIndx - ident.length, - scanner.getCurrentTokenStartPosition(), new String(ident))); - break; - case TokenNameIntegerLiteral : - current.add(new PHPVarDeclaration(current, variableName, - // chIndx - ident.length, - scanner.getCurrentTokenStartPosition(), new String(ident))); - break; - case TokenNameStringInterpolated : - case TokenNameStringLiteral : - current.add(new PHPVarDeclaration(current, variableName, - // chIndx - ident.length, - scanner.getCurrentTokenStartPosition(), new String(ident))); - break; - case TokenNameStringConstant : - current.add(new PHPVarDeclaration(current, variableName, - // chIndx - ident.length, - scanner.getCurrentTokenStartPosition(), new String(ident))); - break; - default : - current.add(new PHPVarDeclaration(current, variableName, - // chIndx - ident.length - scanner.getCurrentTokenStartPosition())); - break; - } - } - - } else { - ident = scanner.getCurrentIdentifierSource(); - - current.add(new PHPVarDeclaration(current, variableName, - // chIndx - ident.length - scanner.getCurrentTokenStartPosition())); - } - } - } else if (token == TokenNamefunction) { - getNextToken(); - if (token == TokenNameAND) { - getNextToken(); - } - if (token == TokenNameIdentifier && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_FUNC)) { - ident = scanner.getCurrentIdentifierSource(); - outlineInfo.addVariable(new String(ident)); - temp = new PHPFunctionDeclaration(current, new String(ident), - // chIndx - ident.length - scanner.getCurrentTokenStartPosition()); - current.add(temp); - getNextToken(); - parseDeclarations(outlineInfo, temp, true); - } - } else if (token == TokenNameclass) { - getNextToken(); - if (token == TokenNameIdentifier && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_CLASS)) { - ident = scanner.getCurrentIdentifierSource(); - outlineInfo.addVariable(new String(ident)); - temp = new PHPClassDeclaration(current, new String(ident), - // chIndx - ident.len - scanner.getCurrentTokenStartPosition()); - current.add(temp); - // stack.push(temp); - getNextToken(); - - //skip tokens for classname, extends and others until we have the opening '{' - while (token != TokenNameLBRACE && token != TokenNameEOF && token != TokenNameERROR) { - getNextToken(); - } - parseDeclarations(outlineInfo, temp, true); - // stack.pop(); - } - } else if ((token == TokenNameLBRACE) || (token == TokenNameDOLLAR_LBRACE)) { - getNextToken(); - counter++; - } else if (token == TokenNameRBRACE) { - getNextToken(); - --counter; - if (counter == 0 && goBack) { - return; - } - } else if (token == TokenNamerequire || token == TokenNamerequire_once || token == TokenNameinclude || token == TokenNameinclude_once) { - ident = scanner.getCurrentTokenSource(); - - getNextToken(); - int startPosition = scanner.getCurrentTokenStartPosition(); - expression(); - char[] expr = scanner.getCurrentTokenSource(startPosition); - outlineInfo.addVariable(new String(ident)); - current.add(new PHPReqIncDeclaration(current, new String(ident), - // chIndx - ident.length, - startPosition, new String(expr))); - getNextToken(); - } else { - getNextToken(); - } - } - } catch (CoreException e) { - } catch (SyntaxError sytaxErr) { -// try { -// // setMarker(sytaxErr.getMessage(), sytaxErr.getLine(), ERROR); -// setMarker(sytaxErr.getMessage(), scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition(), ERROR); -// } catch (CoreException e) { -// } - } - } - - private void statementList() throws CoreException { + // private void parseDeclarations(PHPOutlineInfo outlineInfo, + // OutlineableWithChildren current, boolean goBack) { + // char[] ident; + // // PHPClassDeclaration current = (PHPClassDeclaration) stack.peek(); + // PHPSegmentWithChildren temp; + // int counter = 0; + // IPreferenceStore store = + // PHPeclipsePlugin.getDefault().getPreferenceStore(); + // try { + // while (token != TokenNameEOF && token != TokenNameERROR) { + // if (token == TokenNameVariable) { + // ident = scanner.getCurrentIdentifierSource(); + // outlineInfo.addVariable(new String(ident)); + // getNextToken(); + // } else if (token == TokenNamevar) { + // getNextToken(); + // if (token == TokenNameVariable + // && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_VAR)) { + // ident = scanner.getCurrentIdentifierSource(); + // //substring(1) added because PHPVarDeclaration doesn't + // // need the $ anymore + // String variableName = new String(ident).substring(1); + // outlineInfo.addVariable(variableName); + // getNextToken(); + // if (token != TokenNameSEMICOLON) { + // getNextToken(); + // ident = scanner.getCurrentTokenSource(); + // if (token > TokenNameKEYWORD) { + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - ident.length, + // scanner.getCurrentTokenStartPosition(), new String(ident))); + // } else { + // switch (token) { + // case TokenNameVariable : + // case TokenNamethis : + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - + // // ident.length, + // scanner.getCurrentTokenStartPosition(), new String( + // ident))); + // break; + // case TokenNameIdentifier : + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - + // // ident.length, + // scanner.getCurrentTokenStartPosition(), new String( + // ident))); + // break; + // case TokenNameDoubleLiteral : + // current.add(new PHPVarDeclaration(current, variableName + // + doubleNumber, + // // chIndx - + // // ident.length, + // scanner.getCurrentTokenStartPosition(), new String( + // ident))); + // break; + // case TokenNameIntegerLiteral : + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - + // // ident.length, + // scanner.getCurrentTokenStartPosition(), new String( + // ident))); + // break; + // case TokenNameStringInterpolated : + // case TokenNameStringLiteral : + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - + // // ident.length, + // scanner.getCurrentTokenStartPosition(), new String( + // ident))); + // break; + // case TokenNameStringConstant : + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - + // // ident.length, + // scanner.getCurrentTokenStartPosition(), new String( + // ident))); + // break; + // default : + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - + // // ident.length + // scanner.getCurrentTokenStartPosition())); + // break; + // } + // } + // } else { + // ident = scanner.getCurrentIdentifierSource(); + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - ident.length + // scanner.getCurrentTokenStartPosition())); + // } + // } + // } else if (token == TokenNamefunction) { + // getNextToken(); + // if (token == TokenNameAND) { + // getNextToken(); + // } + // if (token == TokenNameIdentifier + // && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_FUNC)) { + // ident = scanner.getCurrentIdentifierSource(); + // outlineInfo.addVariable(new String(ident)); + // temp = new PHPFunctionDeclaration(current, new String(ident), + // // chIndx - ident.length + // scanner.getCurrentTokenStartPosition()); + // current.add(temp); + // getNextToken(); + // parseDeclarations(outlineInfo, temp, true); + // } + // } else if (token == TokenNameclass) { + // getNextToken(); + // if (token == TokenNameIdentifier + // && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_CLASS)) { + // ident = scanner.getCurrentIdentifierSource(); + // outlineInfo.addVariable(new String(ident)); + // temp = new PHPClassDeclaration(current, new String(ident), + // // chIndx - ident.len + // scanner.getCurrentTokenStartPosition()); + // current.add(temp); + // // stack.push(temp); + // getNextToken(); + // //skip tokens for classname, extends and others until + // // we have the opening '{' + // while (token != TokenNameLBRACE && token != TokenNameEOF + // && token != TokenNameERROR) { + // getNextToken(); + // } + // parseDeclarations(outlineInfo, temp, true); + // // stack.pop(); + // } + // } else if ((token == TokenNameLBRACE) + // || (token == TokenNameDOLLAR_LBRACE)) { + // getNextToken(); + // counter++; + // } else if (token == TokenNameRBRACE) { + // getNextToken(); + // --counter; + // if (counter == 0 && goBack) { + // return; + // } + // } else if (token == TokenNamerequire || token == TokenNamerequire_once + // || token == TokenNameinclude || token == TokenNameinclude_once) { + // ident = scanner.getCurrentTokenSource(); + // getNextToken(); + // int startPosition = scanner.getCurrentTokenStartPosition(); + // expr(); + // char[] expr = scanner.getCurrentTokenSource(startPosition); + // outlineInfo.addVariable(new String(ident)); + // current.add(new PHPReqIncDeclaration(current, new String(ident), + // // chIndx - ident.length, + // startPosition, new String(expr))); + // getNextToken(); + // } else { + // getNextToken(); + // } + // } + // } catch (SyntaxError sytaxErr) { + // // try { + // // // setMarker(sytaxErr.getMessage(), sytaxErr.getLine(), ERROR); + // // setMarker(sytaxErr.getMessage(), + // // scanner.getCurrentTokenStartPosition(), + // // scanner.getCurrentTokenEndPosition(), ERROR); + // // } catch (CoreException e) { + // // } + // } + // } + private void statementList() { do { statement(TokenNameEOF); - if ((token == TokenNameRBRACE) - || (token == TokenNamecase) - || (token == TokenNamedefault) - || (token == TokenNameelse) - || (token == TokenNameelseif) - || (token == TokenNameendif) - || (token == TokenNameendfor) - || (token == TokenNameendforeach) - || (token == TokenNameendwhile) - || (token == TokenNameendswitch) - || (token == TokenNameEOF) - || (token == TokenNameERROR)) { + if ((token == TokenNameRBRACE) || (token == TokenNamecase) + || (token == TokenNamedefault) || (token == TokenNameelse) + || (token == TokenNameelseif) || (token == TokenNameendif) + || (token == TokenNameendfor) || (token == TokenNameendforeach) + || (token == TokenNameendwhile) || (token == TokenNameendswitch) + || (token == TokenNameEOF) || (token == TokenNameERROR)) { return; } } while (true); } - - private void functionBody(MethodDeclaration methodDecl) throws CoreException { + private void functionBody(MethodDeclaration methodDecl) { // '{' [statement-list] '}' if (token == TokenNameLBRACE) { getNextToken(); @@ -1014,28 +938,24 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par throwSyntaxError("'}' expected in compound-statement."); } } - - private void statement(int previousToken) throws CoreException { - // if (token > TokenNameKEYWORD && token != TokenNamelist && token != TokenNamenew) { + private void statement(int previousToken) { + // if (token > TokenNameKEYWORD && token != TokenNamelist && token != + // TokenNamenew) { // char[] ident = scanner.getCurrentIdentifierSource(); // String keyword = new String(ident); - if (token == TokenNameAT) { - getNextToken(); - if (token != TokenNamerequire - && token != TokenNamerequire_once - && token != TokenNameinclude - && token != TokenNameinclude_once - && token != TokenNameIdentifier - && token != TokenNameVariable - && token != TokenNamethis - && token != TokenNameStringInterpolated) { - throwSyntaxError("identifier expected after '@'."); - } - } + if (token == TokenNameAT) { + getNextToken(); + if (token != TokenNamerequire && token != TokenNamerequire_once + && token != TokenNameinclude && token != TokenNameinclude_once + && token != TokenNameIdentifier && token != TokenNameVariable + && token != TokenNamethis && token != TokenNameStringInterpolated) { + throwSyntaxError("identifier expected after '@'."); + } + } if (token == TokenNameinclude || token == TokenNameinclude_once) { getNextToken(); if (token == TokenNameLPAREN) { - expression(); + expr(); if (token == TokenNameSEMICOLON) { getNextToken(); } else { @@ -1047,13 +967,12 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } else { concatenationExpression(); } - return; } else if (token == TokenNamerequire || token == TokenNamerequire_once) { getNextToken(); //constant(); if (token == TokenNameLPAREN) { - expression(); + expr(); if (token == TokenNameSEMICOLON) { getNextToken(); } else { @@ -1073,7 +992,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } else { throwSyntaxError("'(' expected after 'if' keyword."); } - expression(); + expr(); if (token == TokenNameRPAREN) { getNextToken(); } else { @@ -1081,7 +1000,6 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } ifStatement(); return; - } else if (token == TokenNameswitch) { getNextToken(); if (token == TokenNameLPAREN) { @@ -1089,7 +1007,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } else { throwSyntaxError("'(' expected after 'switch' keyword."); } - expression(); + expr(); if (token == TokenNameRPAREN) { getNextToken(); } else { @@ -1143,7 +1061,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } else { throwSyntaxError("'(' expected after 'while' keyword."); } - expression(); + expr(); if (token == TokenNameRPAREN) { getNextToken(); } else { @@ -1173,7 +1091,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } else { throwSyntaxError("'(' expected after 'while' keyword."); } - expression(); + expr(); if (token == TokenNameRPAREN) { getNextToken(); } else { @@ -1198,7 +1116,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } else { throwSyntaxError("'(' expected after 'foreach' keyword."); } - expression(); + expr(); if (token == TokenNameas) { getNextToken(); } else { @@ -1216,11 +1134,11 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } foreachStatement(); return; - - } else if (token == TokenNamecontinue || token == TokenNamebreak || token == TokenNamereturn) { + } else if (token == TokenNamecontinue || token == TokenNamebreak + || token == TokenNamereturn) { getNextToken(); if (token != TokenNameSEMICOLON) { - expression(); + expr(); } if (token == TokenNameSEMICOLON) { getNextToken(); @@ -1231,7 +1149,6 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } return; - } else if (token == TokenNameecho) { getNextToken(); expressionList(); @@ -1256,7 +1173,6 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // getNextToken(); // } // return; - } else if (token == TokenNameglobal || token == TokenNamestatic) { getNextToken(); variableList(); @@ -1269,30 +1185,28 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } return; - - // } else if (token == TokenNameunset) { - // getNextToken(); - // if (token == TokenNameARGOPEN) { - // getNextToken(); - // } else { - // throwSyntaxError("'(' expected after 'unset' keyword."); - // } - // variableList(); - // if (token == TokenNameARGCLOSE) { - // getNextToken(); - // } else { - // throwSyntaxError("')' expected after 'unset' statement."); - // } - // if (token == TokenNameSEMICOLON) { - // getNextToken(); - // } else { - // if (token != TokenNameStopPHP) { - // throwSyntaxError("';' expected after 'unset' statement."); - // } - // getNextToken(); - // } - // return; - + } else if (token == TokenNameunset) { + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + } else { + throwSyntaxError("'(' expected after 'unset' statement."); + } + unset_variables(); + if (token == TokenNameRPAREN) { + getNextToken(); + } else { + throwSyntaxError("')' expected after 'unset' statement."); + } + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + if (token != TokenNameStopPHP) { + throwSyntaxError("';' expected after 'unset' statement."); + } + getNextToken(); + } + return; // } else if (token == TokenNameexit || token == TokenNamedie) { // getNextToken(); // if (token != TokenNameSEMICOLON) { @@ -1302,12 +1216,12 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // getNextToken(); // } else { // if (token != TokenNameStopPHP) { - // throwSyntaxError("';' expected after 'exit' or 'die' statement."); + // throwSyntaxError("';' expected after 'exit' or 'die' + // statement."); // } // getNextToken(); // } // return; - } else if (token == TokenNamedefine) { getNextToken(); if (token == TokenNameLPAREN) { @@ -1315,16 +1229,16 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } else { throwSyntaxError("'(' expected after 'define' keyword."); } - expression(); + expr(); if (token == TokenNameCOMMA) { getNextToken(); } else { throwSyntaxError("',' expected after first 'define' constant."); } - expression(); + expr(); if (token == TokenNameCOMMA) { getNextToken(); - expression(); + expr(); } if (token == TokenNameRPAREN) { getNextToken(); @@ -1341,22 +1255,25 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } return; } else if (token == TokenNamefunction) { - MethodDeclaration methodDecl = new MethodDeclaration(this.compilationUnit.compilationResult); - methodDecl.declarationSourceStart = scanner.getCurrentTokenStartPosition(); + MethodDeclaration methodDecl = new MethodDeclaration( + this.compilationUnit.compilationResult); + methodDecl.declarationSourceStart = scanner + .getCurrentTokenStartPosition(); getNextToken(); functionDefinition(methodDecl); return; - } else if (token == TokenNameclass) { - TypeDeclaration typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult); + } else if (token == TokenNamefinal || token == TokenNameabstract + || token == TokenNameclass || token == TokenNameinterface) { + TypeDeclaration typeDecl = new TypeDeclaration( + this.compilationUnit.compilationResult); typeDecl.declarationSourceStart = scanner.getCurrentTokenStartPosition(); // default super class typeDecl.superclass = new SingleTypeReference(TypeConstants.OBJECT, 0); compilationUnit.types.add(typeDecl); try { pushOnAstStack(typeDecl); - getNextToken(); - classDeclarator(typeDecl); - classBody(typeDecl); + unticked_class_declaration_statement(typeDecl); + // classBody(typeDecl); } finally { astPtr--; astLengthPtr--; @@ -1377,97 +1294,321 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } } else { if (token != TokenNameSEMICOLON) { - expression(); + expr(); } if (token == TokenNameSEMICOLON) { getNextToken(); return; } else { if (token != TokenNameStopPHP && token != TokenNameEOF) { - throwSyntaxError("';' expected after expression (Found token: " + scanner.toStringAction(token) + ")"); + throwSyntaxError("';' expected after expression (Found token: " + + scanner.toStringAction(token) + ")"); } getNextToken(); } } } - - private void classDeclarator(TypeDeclaration typeDecl) throws CoreException { - //identifier - //identifier 'extends' identifier - - - if (token == TokenNameIdentifier || token > TokenNameKEYWORD) { - typeDecl.sourceStart = scanner.getCurrentTokenStartPosition(); - typeDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); - typeDecl.name = scanner.getCurrentIdentifierSource(); - if (token > TokenNameKEYWORD) { - reportSyntaxError( - "Don't use keyword for class declaration [" + scanner.toStringAction(token) + "].", - typeDecl.sourceStart, - typeDecl.sourceEnd); + private void unset_variables() { + // unset_variables: + // unset_variable + // | unset_variables ',' unset_variable + // unset_variable: + // variable + while (true) { + variable(); + if (token != TokenNameCOMMA) { + break; } getNextToken(); - if (token == TokenNameextends) { - do { + } + } + private final void initializeModifiers() { + this.modifiers = 0; + this.modifiersSourceStart = -1; + } + private final void checkAndSetModifiers(int flag) { + this.modifiers |= flag; + if (this.modifiersSourceStart < 0) + this.modifiersSourceStart = this.scanner.startPosition; + } + private void unticked_class_declaration_statement(TypeDeclaration typeDecl) { + initializeModifiers(); + if (token == TokenNameinterface) { + // interface_entry T_STRING + // interface_extends_list + // '{' class_statement_list '}' + checkAndSetModifiers(AccInterface); + getNextToken(); + typeDecl.modifiers = this.modifiers; + if (token == TokenNameIdentifier || token > TokenNameKEYWORD) { + typeDecl.sourceStart = scanner.getCurrentTokenStartPosition(); + typeDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); + typeDecl.name = scanner.getCurrentIdentifierSource(); + if (token > TokenNameKEYWORD) { + throwSyntaxError("Don't use a keyword for interface declaration [" + + scanner.toStringAction(token) + "].", typeDecl.sourceStart, + typeDecl.sourceEnd); + } + getNextToken(); + interface_extends_list(); + } else { + typeDecl.sourceStart = scanner.getCurrentTokenStartPosition(); + typeDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); + typeDecl.name = new char[]{' '}; + throwSyntaxError("Interface name expected after keyword 'interface'.", + typeDecl.sourceStart, typeDecl.sourceEnd); + return; + } + } else { + // class_entry_type T_STRING extends_from + // implements_list + // '{' class_statement_list'}' + class_entry_type(); + typeDecl.modifiers = this.modifiers; + //identifier + //identifier 'extends' identifier + if (token == TokenNameIdentifier || token > TokenNameKEYWORD) { + typeDecl.sourceStart = scanner.getCurrentTokenStartPosition(); + typeDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); + typeDecl.name = scanner.getCurrentIdentifierSource(); + if (token > TokenNameKEYWORD) { + throwSyntaxError("Don't use a keyword for class declaration [" + + scanner.toStringAction(token) + "].", typeDecl.sourceStart, + typeDecl.sourceEnd); + } + getNextToken(); + // extends_from: + // /* empty */ + // | T_EXTENDS fully_qualified_class_name + if (token == TokenNameextends) { getNextToken(); if (token == TokenNameIdentifier) { getNextToken(); } else { - reportSyntaxError("Class name expected after keyword 'extends'.", scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition()); + throwSyntaxError("Class name expected after keyword 'extends'.", + scanner.getCurrentTokenStartPosition(), scanner + .getCurrentTokenEndPosition()); } - } while (token == TokenNameCOMMA); - } - } else { - typeDecl.sourceStart = scanner.getCurrentTokenStartPosition(); - typeDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); - - typeDecl.name = new char[] { ' ' }; - reportSyntaxError("Class name expected after keyword 'class'.", typeDecl.sourceStart, typeDecl.sourceEnd); - // throwSyntaxError("ClassDeclaration name expected after keyword 'class'."); + } + implements_list(); + } else { + typeDecl.sourceStart = scanner.getCurrentTokenStartPosition(); + typeDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); + typeDecl.name = new char[]{' '}; + throwSyntaxError("Class name expected after keyword 'class'.", + typeDecl.sourceStart, typeDecl.sourceEnd); + return; + } } - } - - private void classBody(TypeDeclaration typeDecl) throws CoreException { - //'{' [class-element-list] '}' + // '{' class_statement_list '}' if (token == TokenNameLBRACE) { getNextToken(); if (token != TokenNameRBRACE) { - classElementList(); + class_statement_list(); } if (token == TokenNameRBRACE) { typeDecl.declarationSourceEnd = scanner.getCurrentTokenEndPosition(); getNextToken(); } else { - throwSyntaxError("'}' expected at end of class body."); + throwSyntaxError("'}' expected at end of interface body."); } } else { - throwSyntaxError("'{' expected at start of class body."); + throwSyntaxError("'{' expected at start of interface body."); } } - - private void classElementList() throws CoreException { + private void class_entry_type() { + // T_CLASS + // | T_ABSTRACT T_CLASS + // | T_FINAL T_CLASS + if (token == TokenNameclass) { + getNextToken(); + } else if (token == TokenNamefinal) { + checkAndSetModifiers(AccAbstract); + getNextToken(); + if (token != TokenNameclass) { + throwSyntaxError("Keyword 'class' expected after keyword 'abstract'."); + } + getNextToken(); + } else if (token == TokenNamefinal) { + checkAndSetModifiers(AccFinal); + if (token != TokenNameclass) { + throwSyntaxError("Keyword 'class' expected after keyword 'final'."); + } + getNextToken(); + } + } + private void interface_extends_list() { + // /* empty */ + // | T_EXTENDS interface_list + if (token == TokenNameextends) { + getNextToken(); + interface_list(); + } + } + private void implements_list() { + // /* empty */ + // | T_IMPLEMENTS interface_list + if (token == TokenNameimplements) { + getNextToken(); + interface_list(); + } + } + private void interface_list() { + // interface_list: + // fully_qualified_class_name + //| interface_list ',' fully_qualified_class_name do { - classElement(); + if (token == TokenNameIdentifier) { + getNextToken(); + } else { + throwSyntaxError("Interface name expected after keyword 'implements'."); + } + if (token != TokenNameCOMMA) { + return; + } + getNextToken(); + } while (true); + } + // private void classBody(TypeDeclaration typeDecl) { + // //'{' [class-element-list] '}' + // if (token == TokenNameLBRACE) { + // getNextToken(); + // if (token != TokenNameRBRACE) { + // class_statement_list(); + // } + // if (token == TokenNameRBRACE) { + // typeDecl.declarationSourceEnd = scanner.getCurrentTokenEndPosition(); + // getNextToken(); + // } else { + // throwSyntaxError("'}' expected at end of class body."); + // } + // } else { + // throwSyntaxError("'{' expected at start of class body."); + // } + // } + private void class_statement_list() { + do { + class_statement(); } while (token == TokenNamefunction || token == TokenNamevar); } - - private void classElement() throws CoreException { - //class-property - //function-definition - if (token == TokenNamefunction) { - MethodDeclaration methodDecl = new MethodDeclaration(this.compilationUnit.compilationResult); - methodDecl.declarationSourceStart = scanner.getCurrentTokenStartPosition(); - getNextToken(); - functionDefinition(methodDecl); - } else if (token == TokenNamevar) { + private void class_statement() { + // class_statement: + // variable_modifiers class_variable_declaration ';' + // | class_constant_declaration ';' + // | method_modifiers T_FUNCTION is_reference T_STRING + // '(' parameter_list ')' method_body + initializeModifiers(); + if (token == TokenNamevar) { + checkAndSetModifiers(AccPublic); + reportSyntaxError( + "Keyword 'var' is deprecated. Please use 'public' 'private' or 'protected' modifier for field declarations.", + scanner.getCurrentTokenStartPosition(), scanner + .getCurrentTokenEndPosition()); getNextToken(); classProperty(); } else { - throwSyntaxError("'function' or 'var' expected."); + boolean hasModifiers = member_modifiers(); + if (token == TokenNamefunction) { + if (!hasModifiers) { + checkAndSetModifiers(AccPublic); + } + MethodDeclaration methodDecl = new MethodDeclaration( + this.compilationUnit.compilationResult); + methodDecl.declarationSourceStart = scanner + .getCurrentTokenStartPosition(); + methodDecl.modifiers = this.modifiers; + getNextToken(); + functionDefinition(methodDecl); + } else { + if (!hasModifiers) { + throwSyntaxError("'public' 'private' or 'protected' modifier expected for field declarations."); + } + classProperty(); + } } + // if (token == TokenNamefunction) { + // MethodDeclaration methodDecl = new MethodDeclaration( + // this.compilationUnit.compilationResult); + // methodDecl.declarationSourceStart = scanner + // .getCurrentTokenStartPosition(); + // getNextToken(); + // functionDefinition(methodDecl); + // } else if (token == TokenNamevar) { + // getNextToken(); + // classProperty(); + // } else { + // throwSyntaxError("'function' or 'var' expected."); + // } } - - private void classProperty() throws CoreException { + // private void variable_modifiers() { + // // variable_modifiers: + // // non_empty_member_modifiers + // //| T_VAR + // initializeModifiers(); + // if (token == TokenNamevar) { + // checkAndSetModifiers(AccPublic); + // reportSyntaxError( + // "Keyword 'var' is deprecated. Please use 'public' 'private' or 'protected' + // modifier for field declarations.", + // scanner.getCurrentTokenStartPosition(), scanner + // .getCurrentTokenEndPosition()); + // getNextToken(); + // } else { + // if (!member_modifiers()) { + // throwSyntaxError("'public' 'private' or 'protected' modifier expected for + // field declarations."); + // } + // } + // } + // private void method_modifiers() { + // //method_modifiers: + // // /* empty */ + // //| non_empty_member_modifiers + // initializeModifiers(); + // if (!member_modifiers()) { + // checkAndSetModifiers(AccPublic); + // } + // } + private boolean member_modifiers() { + // T_PUBLIC + //| T_PROTECTED + //| T_PRIVATE + //| T_STATIC + //| T_ABSTRACT + //| T_FINAL + boolean foundToken = false; + while (true) { + if (token == TokenNamepublic) { + checkAndSetModifiers(AccPublic); + getNextToken(); + foundToken = true; + } else if (token == TokenNameprotected) { + checkAndSetModifiers(AccProtected); + getNextToken(); + foundToken = true; + } else if (token == TokenNameprivate) { + checkAndSetModifiers(AccPrivate); + getNextToken(); + foundToken = true; + } else if (token == TokenNamestatic) { + checkAndSetModifiers(AccStatic); + getNextToken(); + foundToken = true; + } else if (token == TokenNameabstract) { + checkAndSetModifiers(AccAbstract); + getNextToken(); + foundToken = true; + } else if (token == TokenNamefinal) { + checkAndSetModifiers(AccFinal); + getNextToken(); + foundToken = true; + } else { + break; + } + } + return foundToken; + } + private void classProperty() { //'var' variable ';' //'var' variable '=' constant ';' do { @@ -1494,8 +1635,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par throwSyntaxError("';' expected after variable declaration."); } } - - private void functionDefinition(MethodDeclaration methodDecl) throws CoreException { + private void functionDefinition(MethodDeclaration methodDecl) { if (astPtr == 0) { compilationUnit.types.add(methodDecl); } else { @@ -1503,10 +1643,15 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par if (node instanceof TypeDeclaration) { TypeDeclaration typeDecl = ((TypeDeclaration) node); if (typeDecl.methods == null) { - typeDecl.methods = new AbstractMethodDeclaration[] { methodDecl }; + typeDecl.methods = new AbstractMethodDeclaration[]{methodDecl}; } else { AbstractMethodDeclaration[] newMethods; - System.arraycopy(typeDecl.methods, 0, newMethods = new AbstractMethodDeclaration[typeDecl.methods.length + 1], 1, typeDecl.methods.length); + System + .arraycopy( + typeDecl.methods, + 0, + newMethods = new AbstractMethodDeclaration[typeDecl.methods.length + 1], + 1, typeDecl.methods.length); newMethods[0] = methodDecl; typeDecl.methods = newMethods; } @@ -1515,8 +1660,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par functionDeclarator(methodDecl); functionBody(methodDecl); } - - private void functionDeclarator(MethodDeclaration methodDecl) throws CoreException { + private void functionDeclarator(MethodDeclaration methodDecl) { //identifier '(' [parameter-list] ')' if (token == TokenNameAND) { getNextToken(); @@ -1542,13 +1686,14 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } } else { if (token > TokenNameKEYWORD) { - throwSyntaxError("Don't use keyword for function declaration [" + token + "]."); + throwSyntaxError("Don't use keyword for function declaration [" + token + + "]."); } throwSyntaxError("Function name expected after keyword 'function'."); } } // - private void parameterList() throws CoreException { + private void parameterList() { //parameter-declaration //parameter-list ',' parameter-declaration do { @@ -1559,8 +1704,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } while (true); } - - private void parameterDeclaration() throws CoreException { + private void parameterDeclaration() { //variable //variable-reference if (token == TokenNameAND) { @@ -1584,36 +1728,40 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par throwSyntaxError("Reserved word '$this' not allowed in parameter declaration."); } } - - private void labeledStatementList() throws CoreException { + private void labeledStatementList() { if (token != TokenNamecase && token != TokenNamedefault) { throwSyntaxError("'case' or 'default' expected."); } do { if (token == TokenNamecase) { getNextToken(); - expression(); //constant(); + expr(); //constant(); if (token == TokenNameCOLON || token == TokenNameSEMICOLON) { getNextToken(); - if (token == TokenNamecase || token == TokenNamedefault) { // empty case statement ? + if (token == TokenNamecase || token == TokenNamedefault) { // empty + // case + // statement + // ? continue; } statementList(); - } -// else if (token == TokenNameSEMICOLON) { -// setMarker( -// "':' expected after 'case' keyword (Found token: " + scanner.toStringAction(token) + ")", -// scanner.getCurrentTokenStartPosition(), -// scanner.getCurrentTokenEndPosition(), -// INFO); -// getNextToken(); -// if (token == TokenNamecase) { // empty case statement ? -// continue; -// } -// statementList(); -// } - else { - throwSyntaxError("':' character after 'case' constant expected (Found token: " + scanner.toStringAction(token) + ")"); + } + // else if (token == TokenNameSEMICOLON) { + // setMarker( + // "':' expected after 'case' keyword (Found token: " + + // scanner.toStringAction(token) + ")", + // scanner.getCurrentTokenStartPosition(), + // scanner.getCurrentTokenEndPosition(), + // INFO); + // getNextToken(); + // if (token == TokenNamecase) { // empty case statement ? + // continue; + // } + // statementList(); + // } + else { + throwSyntaxError("':' character after 'case' constant expected (Found token: " + + scanner.toStringAction(token) + ")"); } } else { // TokenNamedefault getNextToken(); @@ -1626,7 +1774,6 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } } while (token == TokenNamecase || token == TokenNamedefault); } - // public void labeledStatement() { // if (token == TokenNamecase) { // getNextToken(); @@ -1649,16 +1796,12 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // return; // } // } - // public void expressionStatement() { // } - // private void inclusionStatement() { // } - // public void compoundStatement() { // } - // public void selectionStatement() { // } // @@ -1679,8 +1822,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // // public void definitionStatement() { // } - - private void ifStatement() throws CoreException { + private void ifStatement() { // ':' statement-list [elseif-list] [else-colon-statement] 'endif' ';' if (token == TokenNameCOLON) { getNextToken(); @@ -1709,7 +1851,6 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par break; } } - if (token != TokenNameendif) { throwSyntaxError("'endif' expected."); } @@ -1728,7 +1869,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } else { throwSyntaxError("'(' expected after 'elseif' keyword."); } - expression(); + expr(); if (token == TokenNameRPAREN) { getNextToken(); } else { @@ -1741,8 +1882,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } } } - - private void elseifStatementList() throws CoreException { + private void elseifStatementList() { do { elseifStatement(); switch (token) { @@ -1770,11 +1910,10 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } } while (true); } - - private void elseifStatement() throws CoreException { + private void elseifStatement() { if (token == TokenNameLPAREN) { getNextToken(); - expression(); + expr(); if (token != TokenNameRPAREN) { throwSyntaxError("')' expected in else-if-statement."); } @@ -1788,8 +1927,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } } } - - private void switchStatement() throws CoreException { + private void switchStatement() { if (token == TokenNameCOLON) { // ':' [labeled-statement-list] 'endswitch' ';' getNextToken(); @@ -1815,11 +1953,9 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par throwSyntaxError("'}' expected in switch statement."); } getNextToken(); - } } - - private void forStatement() throws CoreException { + private void forStatement() { if (token == TokenNameCOLON) { getNextToken(); statementList(); @@ -1835,8 +1971,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par statement(TokenNameEOF); } } - - private void whileStatement() throws CoreException { + private void whileStatement() { // ':' statement-list 'endwhile' ';' if (token == TokenNameCOLON) { getNextToken(); @@ -1853,8 +1988,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par statement(TokenNameEOF); } } - - private void foreachStatement() throws CoreException { + private void foreachStatement() { if (token == TokenNameCOLON) { getNextToken(); statementList(); @@ -1870,26 +2004,24 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par statement(TokenNameEOF); } } - - private void exitStatus() throws CoreException { - if (token == TokenNameLPAREN) { - getNextToken(); - } else { - throwSyntaxError("'(' expected in 'exit-status'."); - } - if (token != TokenNameRPAREN) { - expression(); - } - if (token == TokenNameRPAREN) { - getNextToken(); - } else { - throwSyntaxError("')' expected after 'exit-status'."); - } - } - - private void expressionList() throws CoreException { + // private void exitStatus() { + // if (token == TokenNameLPAREN) { + // getNextToken(); + // } else { + // throwSyntaxError("'(' expected in 'exit-status'."); + // } + // if (token != TokenNameRPAREN) { + // expression(); + // } + // if (token == TokenNameRPAREN) { + // getNextToken(); + // } else { + // throwSyntaxError("')' expected after 'exit-status'."); + // } + // } + private void expressionList() { do { - expression(); + expr(); if (token == TokenNameCOMMA) { getNextToken(); } else { @@ -1897,8 +2029,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } } while (true); } - - private void expression() throws CoreException { + private void expr() { //todo: find a better way to get the expression // expression = new StringBuffer(); // for (int i = chIndx; i < str.length(); i++) { @@ -1907,26 +2038,34 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // } // expression.append(str.charAt(i)); // } - - // if (token == TokenNameSTRING_CONSTANT || token == TokenNameINTERPOLATED_STRING) { + // if (token == TokenNameSTRING_CONSTANT || token == + // TokenNameINTERPOLATED_STRING) { // getNextToken(); // } else { logicalinclusiveorExpression(); // while (token != TokenNameSEMICOLON) { // getNextToken(); - // // } + // // } // } } - - private void postfixExpression() throws CoreException { + private void expr_without_variable() { // String ident; char[] ident; boolean castFlag = false; boolean arrayFlag = false; switch (token) { + case TokenNameisset : + case TokenNameempty : + case TokenNameeval : + case TokenNameinclude : + case TokenNameinclude_once : + case TokenNamerequire : + case TokenNamerequire_once : + internal_functions_in_yacc(); + break; case TokenNamenew : getNextToken(); - expression(); + expr(); break; case TokenNamenull : getNextToken(); @@ -1947,7 +2086,6 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par break; case TokenNameLPAREN : getNextToken(); - if (token == TokenNameIdentifier) { // check if identifier is a type: // ident = identifier; @@ -1963,7 +2101,6 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } } } - if (castFlag) { getNextToken(); if (arrayFlag && token == TokenNameLPAREN) { @@ -1971,7 +2108,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par if (token == TokenNameRPAREN) { getNextToken(); } else { - expression(); + expr(); if (token != TokenNameRPAREN) { throwSyntaxError(") expected after 'array('."); } @@ -1981,10 +2118,10 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par throwSyntaxError(") expected after cast-type '" + str + "'."); } getNextToken(); - expression(); + expr(); break; } else { - expression(); + expr(); } if (token != TokenNameRPAREN) { throwSyntaxError(") expected in postfix-expression."); @@ -1999,7 +2136,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par break; case TokenNameDOLLAR_LBRACE : getNextToken(); - expression(); + expr(); if (token != TokenNameRBRACE) { throwSyntaxError("'}' expected after indirect variable token '${'."); } @@ -2011,9 +2148,10 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); if (token == TokenNameLBRACE) { getNextToken(); - expression(); + expr(); if (token != TokenNameRBRACE) { - throwSyntaxError("'}' expected after variable '" + new String(ident) + "' in variable-expression."); + throwSyntaxError("'}' expected after variable '" + + new String(ident) + "' in variable-expression."); } getNextToken(); } else if (token == TokenNameLPAREN) { @@ -2021,7 +2159,8 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par if (token != TokenNameRPAREN) { expressionList(); if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected after variable '" + new String(ident) + "' in postfix-expression."); + throwSyntaxError("')' expected after variable '" + + new String(ident) + "' in postfix-expression."); } } getNextToken(); @@ -2035,8 +2174,9 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par if (token != TokenNameRPAREN) { expressionList(); if (token != TokenNameRPAREN) { - throwSyntaxError( - "')' expected after identifier '" + new String(ident) + "' in postfix-expression." + "(Found token: " + scanner.toStringAction(token) + ")"); + throwSyntaxError("')' expected after identifier '" + + new String(ident) + "' in postfix-expression." + + "(Found token: " + scanner.toStringAction(token) + ")"); } } getNextToken(); @@ -2044,15 +2184,11 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par break; case TokenNameprint : getNextToken(); - expression(); - // if (token == TokenNameSEMICOLON) { - // getNextToken(); - // } else { - // if (token != TokenNameStopPHP) { - // throwSyntaxError("';' expected after 'print' statement."); - // } - // getNextToken(); - // } + expr(); + break; + case TokenNameexit : + getNextToken(); + exit_expr(); break; case TokenNamelist : getNextToken(); @@ -2074,68 +2210,69 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par throwSyntaxError("'(' expected after 'list' keyword."); } break; - // case TokenNameexit : - // getNextToken(); - // if (token != TokenNameSEMICOLON) { - // exitStatus(); - // } - // if (token == TokenNameSEMICOLON) { - // getNextToken(); - // } else { - // if (token != TokenNameStopPHP) { - // throwSyntaxError("';' expected after 'exit' expression."); - // } - // getNextToken(); - // } - // break; - // case TokenNamedie : - // getNextToken(); - // if (token != TokenNameSEMICOLON) { - // exitStatus(); - // } - // if (token == TokenNameSEMICOLON) { - // getNextToken(); - // } else { - // if (token != TokenNameStopPHP) { - // throwSyntaxError("';' expected after 'die' expression."); - // } - // } - // break; - - // case TokenNamearray : - // getNextToken(); - // if (token == TokenNameARGOPEN) { - // getNextToken(); - // if (token == TokenNameCOMMA) { - // getNextToken(); - // } - // expressionList(); - // if (token != TokenNameARGCLOSE) { - // throwSyntaxError("')' expected after 'list' keyword."); - // } - // getNextToken(); - // if (token == TokenNameSET) { - // getNextToken(); - // logicalinclusiveorExpression(); - // } - // } else { - // throwSyntaxError("'(' expected after 'list' keyword."); - // } - // break; + // case TokenNameexit : + // getNextToken(); + // if (token != TokenNameSEMICOLON) { + // exitStatus(); + // } + // if (token == TokenNameSEMICOLON) { + // getNextToken(); + // } else { + // if (token != TokenNameStopPHP) { + // throwSyntaxError("';' expected after 'exit' expression."); + // } + // getNextToken(); + // } + // break; + // case TokenNamedie : + // getNextToken(); + // if (token != TokenNameSEMICOLON) { + // exitStatus(); + // } + // if (token == TokenNameSEMICOLON) { + // getNextToken(); + // } else { + // if (token != TokenNameStopPHP) { + // throwSyntaxError("';' expected after 'die' expression."); + // } + // } + // break; + // case TokenNamearray : + // getNextToken(); + // if (token == TokenNameARGOPEN) { + // getNextToken(); + // if (token == TokenNameCOMMA) { + // getNextToken(); + // } + // expressionList(); + // if (token != TokenNameARGCLOSE) { + // throwSyntaxError("')' expected after 'list' keyword."); + // } + // getNextToken(); + // if (token == TokenNameSET) { + // getNextToken(); + // logicalinclusiveorExpression(); + // } + // } else { + // throwSyntaxError("'(' expected after 'list' keyword."); + // } + // break; } boolean while_flag = true; do { switch (token) { case TokenNameLBRACKET : getNextToken(); - expression(); + expr(); if (token != TokenNameRBRACKET) { throwSyntaxError("] expected in postfix-expression."); } getNextToken(); break; - case TokenNameCOLON_COLON : // :: - case TokenNameMINUS_GREATER : // -> + case TokenNameCOLON_COLON : + // :: + case TokenNameMINUS_GREATER : + // -> getNextToken(); if (token > TokenNameKEYWORD) { ident = scanner.getCurrentIdentifierSource(); @@ -2145,11 +2282,12 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // + "' as variable name.", // rowCount, // PHPParser.INFO); -// setMarker( -// "Avoid using keyword '" + new String(ident) + "' as variable name.", -// scanner.getCurrentTokenStartPosition(), -// scanner.getCurrentTokenEndPosition(), -// INFO); + // setMarker( + // "Avoid using keyword '" + new String(ident) + "' as + // variable name.", + // scanner.getCurrentTokenStartPosition(), + // scanner.getCurrentTokenEndPosition(), + // INFO); } switch (token) { case TokenNameVariable : @@ -2159,7 +2297,8 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // getNextToken(); // expressionList(); // if (token != TokenNameARGCLOSE) { - // throwSyntaxError(") expected after variable '" + ident + "'."); + // throwSyntaxError(") expected after variable '" + + // ident + "'."); // } // getNextToken(); // } @@ -2170,7 +2309,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par break; case TokenNameLBRACE : getNextToken(); - expression(); + expr(); if (token != TokenNameRBRACE) { throwSyntaxError("} expected in postfix-expression."); } @@ -2178,30 +2317,32 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par break; default : throwSyntaxError("Syntax error after '->' token."); - } while (token == TokenNameLBRACKET || token == TokenNameLPAREN || token == TokenNameLBRACE) { - if (token == TokenNameLBRACKET) { - getNextToken(); - expressionList(); - if (token != TokenNameRBRACKET) { - throwSyntaxError("] expected after '->'."); - } - getNextToken(); - } else if (token == TokenNameLPAREN) { - getNextToken(); - expressionList(); - if (token != TokenNameRPAREN) { - throwSyntaxError(") expected after '->'."); - } - getNextToken(); - } else if (token == TokenNameLBRACE) { - getNextToken(); - expression(); - if (token != TokenNameRBRACE) { - throwSyntaxError("} expected after '->'."); - } - getNextToken(); + } + while (token == TokenNameLBRACKET || token == TokenNameLPAREN + || token == TokenNameLBRACE) { + if (token == TokenNameLBRACKET) { + getNextToken(); + expressionList(); + if (token != TokenNameRBRACKET) { + throwSyntaxError("] expected after '->'."); } + getNextToken(); + } else if (token == TokenNameLPAREN) { + getNextToken(); + expressionList(); + if (token != TokenNameRPAREN) { + throwSyntaxError(") expected after '->'."); + } + getNextToken(); + } else if (token == TokenNameLBRACE) { + getNextToken(); + expr(); + if (token != TokenNameRBRACE) { + throwSyntaxError("} expected after '->'."); + } + getNextToken(); } + } break; case TokenNamePLUS_PLUS : getNextToken(); @@ -2212,12 +2353,9 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par default : while_flag = false; } - - } - while (while_flag); + } while (while_flag); } - - private void unaryExpression() throws CoreException { + private void unaryExpression() { switch (token) { case TokenNamePLUS_PLUS : getNextToken(); @@ -2227,13 +2365,14 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); unaryExpression(); break; - // '@' '&' '*' '+' '-' '~' '!' + // '@' '&' '*' '+' '-' '~' '!' case TokenNameAT : getNextToken(); - if (token == TokenNameinclude || token == TokenNameinclude_once || token == TokenNamerequire || token == TokenNamerequire_once) { + if (token == TokenNameinclude || token == TokenNameinclude_once + || token == TokenNamerequire || token == TokenNamerequire_once) { statement(TokenNameAT); } else { - postfixExpression(); // castExpression(); + expr_without_variable(); // castExpression(); } break; case TokenNameAND : @@ -2261,11 +2400,10 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par castExpression(); break; default : - postfixExpression(); + expr_without_variable(); } } - - private void castExpression() throws CoreException { + private void castExpression() { // if (token == TokenNameARGOPEN) { // getNextToken(); // typeName(); @@ -2276,8 +2414,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // } unaryExpression(); } - - private void assignExpression() throws CoreException { + private void assignExpression() { castExpression(); if (token == TokenNameEQUAL) { // = getNextToken(); @@ -2323,18 +2460,17 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par logicalinclusiveorExpression(); } } - - private void multiplicativeExpression() throws CoreException { + private void multiplicativeExpression() { do { assignExpression(); - if (token != TokenNameMULTIPLY && token != TokenNameDIVIDE && token != TokenNameREMAINDER) { + if (token != TokenNameMULTIPLY && token != TokenNameDIVIDE + && token != TokenNameREMAINDER) { return; } getNextToken(); } while (true); } - - private void concatenationExpression() throws CoreException { + private void concatenationExpression() { do { multiplicativeExpression(); if (token != TokenNameDOT) { @@ -2343,8 +2479,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } while (true); } - - private void additiveExpression() throws CoreException { + private void additiveExpression() { do { concatenationExpression(); if (token != TokenNamePLUS && token != TokenNameMINUS) { @@ -2353,8 +2488,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } while (true); } - - private void shiftExpression() throws CoreException { + private void shiftExpression() { do { additiveExpression(); if (token != TokenNameLEFT_SHIFT && token != TokenNameRIGHT_SHIFT) { @@ -2363,28 +2497,27 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } while (true); } - - private void relationalExpression() throws CoreException { + private void relationalExpression() { do { shiftExpression(); - if (token != TokenNameLESS && token != TokenNameGREATER && token != TokenNameLESS_EQUAL && token != TokenNameGREATER_EQUAL) { + if (token != TokenNameLESS && token != TokenNameGREATER + && token != TokenNameLESS_EQUAL && token != TokenNameGREATER_EQUAL) { return; } getNextToken(); } while (true); } - - private void identicalExpression() throws CoreException { + private void identicalExpression() { do { relationalExpression(); - if (token != TokenNameEQUAL_EQUAL_EQUAL && token != TokenNameNOT_EQUAL_EQUAL) { + if (token != TokenNameEQUAL_EQUAL_EQUAL + && token != TokenNameNOT_EQUAL_EQUAL) { return; } getNextToken(); } while (true); } - - private void equalityExpression() throws CoreException { + private void equalityExpression() { do { identicalExpression(); if (token != TokenNameEQUAL_EQUAL && token != TokenNameNOT_EQUAL) { @@ -2393,22 +2526,20 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } while (true); } - - private void ternaryExpression() throws CoreException { + private void ternaryExpression() { equalityExpression(); if (token == TokenNameQUESTION) { getNextToken(); - expression(); + expr(); if (token == TokenNameCOLON) { getNextToken(); - expression(); + expr(); } else { throwSyntaxError("':' expected in ternary operator '? :'."); } } } - - private void andExpression() throws CoreException { + private void andExpression() { do { ternaryExpression(); if (token != TokenNameAND) { @@ -2417,8 +2548,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } while (true); } - - private void exclusiveorExpression() throws CoreException { + private void exclusiveorExpression() { do { andExpression(); if (token != TokenNameXOR) { @@ -2427,8 +2557,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } while (true); } - - private void inclusiveorExpression() throws CoreException { + private void inclusiveorExpression() { do { exclusiveorExpression(); if (token != TokenNameOR) { @@ -2437,8 +2566,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } while (true); } - - private void booleanandExpression() throws CoreException { + private void booleanandExpression() { do { inclusiveorExpression(); if (token != TokenNameAND_AND) { @@ -2447,8 +2575,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } while (true); } - - private void booleanorExpression() throws CoreException { + private void booleanorExpression() { do { booleanandExpression(); if (token != TokenNameOR_OR) { @@ -2457,8 +2584,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } while (true); } - - private void logicalandExpression() throws CoreException { + private void logicalandExpression() { do { booleanorExpression(); if (token != TokenNameAND) { @@ -2467,8 +2593,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } while (true); } - - private void logicalexclusiveorExpression() throws CoreException { + private void logicalexclusiveorExpression() { do { logicalandExpression(); if (token != TokenNameXOR) { @@ -2477,8 +2602,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } while (true); } - - private void logicalinclusiveorExpression() throws CoreException { + private void logicalinclusiveorExpression() { do { logicalexclusiveorExpression(); if (token != TokenNameOR) { @@ -2487,7 +2611,6 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); } while (true); } - // public void assignmentExpression() { // if (token == TokenNameVARIABLE) { // getNextToken(); @@ -2499,8 +2622,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // logicalinclusiveorExpression(); // } // } - - private void variableList() throws CoreException { + private void variableList() { do { variable(); if (token == TokenNameCOMMA) { @@ -2510,11 +2632,10 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } } while (true); } - - private void variable() throws CoreException { + private void variable() { if (token == TokenNameDOLLAR_LBRACE) { getNextToken(); - expression(); + expr(); ; if (token != TokenNameRBRACE) { throwSyntaxError("'}' expected after indirect variable token '${'."); @@ -2525,7 +2646,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par getNextToken(); if (token == TokenNameLBRACKET) { getNextToken(); - expression(); + expr(); if (token != TokenNameRBRACKET) { throwSyntaxError("']' expected in variable-list."); } @@ -2539,12 +2660,106 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } } } - + private void exit_expr() { + // /* empty */ + // | '(' ')' + // | '(' expr ')' + if (token != TokenNameLPAREN) { + return; + } + getNextToken(); + if (token == TokenNameRPAREN) { + getNextToken(); + return; + } + expr(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected after keyword 'exit'"); + } + getNextToken(); + } + private void internal_functions_in_yacc() { + switch (token) { + case TokenNameisset : + // T_ISSET '(' isset_variables ')' + getNextToken(); + if (token != TokenNameLPAREN) { + throwSyntaxError("'(' expected after keyword 'isset'"); + } + getNextToken(); + isset_variables(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected after keyword 'isset'"); + } + getNextToken(); + break; + case TokenNameempty : + // T_EMPTY '(' variable ')' + getNextToken(); + if (token != TokenNameLPAREN) { + throwSyntaxError("'(' expected after keyword 'empty'"); + } + getNextToken(); + variable(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected after keyword 'empty'"); + } + getNextToken(); + break; + case TokenNameinclude : + //T_INCLUDE expr + getNextToken(); + expr(); + break; + case TokenNameinclude_once : + // T_INCLUDE_ONCE expr + getNextToken(); + expr(); + break; + case TokenNameeval : + // T_EVAL '(' expr ')' + getNextToken(); + if (token != TokenNameLPAREN) { + throwSyntaxError("'(' expected after keyword 'eval'"); + } + getNextToken(); + expr(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected after keyword 'eval'"); + } + getNextToken(); + break; + case TokenNamerequire : + //T_REQUIRE expr + getNextToken(); + expr(); + break; + case TokenNamerequire_once : + // T_REQUIRE_ONCE expr + getNextToken(); + expr(); + break; + } + } + private void isset_variables() { + // variable + // | isset_variables ',' + if (token == TokenNameRPAREN) { + throwSyntaxError("Variable expected after keyword 'isset'"); + } + while (true) { + variable(); + if (token == TokenNameCOMMA) { + getNextToken(); + } else { + break; + } + } + } /** - * It will look for a value (after a '=' for example) - * @throws CoreException + * It will look for a value (after a '=' for example) @ */ - private void constant() throws CoreException { + private void constant() { // String ident; switch (token) { case TokenNamePLUS : @@ -2591,7 +2806,8 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par if (token != TokenNameRPAREN) { expressionList(); if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected after identifier '" + new String(ident) + "' in postfix-expression."); + throwSyntaxError("')' expected after identifier '" + + new String(ident) + "' in postfix-expression."); } } getNextToken(); @@ -2616,16 +2832,13 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par throwSyntaxError("Constant expected."); } } - - public void reportSyntaxError() { //int act, int currentKind, int stateStackTop) { - + public void reportSyntaxError() { //int act, int currentKind, int + // stateStackTop) { /* remember current scanner position */ int startPos = scanner.startPosition; int currentPos = scanner.currentPosition; - // String[] expectings; // String tokenName = name[symbol_index[currentKind]]; - //fetch all "accurate" possible terminals that could recover the error // int start, end = start = asi(stack[stateStackTop]); // while (asr[end] != 0) @@ -2639,8 +2852,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // expectings[i] = name[symbol_index[indexes[i]]]; // } // } - - //if the pb is an EOF, try to tell the user that they are some + //if the pb is an EOF, try to tell the user that they are some // if (tokenName.equals(UNEXPECTED_EOF)) { // if (!this.checkAndReportBracketAnomalies(problemReporter())) { // char[] tokenSource; @@ -2650,11 +2862,11 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // tokenSource = new char[] {}; // } // problemReporter().parseError( - // this.scanner.startPosition, - // this.scanner.currentPosition - 1, - // tokenSource, - // tokenName, - // expectings); + // this.scanner.startPosition, + // this.scanner.currentPosition - 1, + // tokenSource, + // tokenName, + // expectings); // } // } else { //the next test is HEAVILY grammar DEPENDENT. // if ((length == 14) @@ -2670,7 +2882,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // case TokenNameMULTIPLY: // case TokenNameLEFT_SHIFT: // case TokenNameRIGHT_SHIFT: - //// case TokenNameUNSIGNED_RIGHT_SHIFT: + //// case TokenNameUNSIGNED_RIGHT_SHIFT: // case TokenNameLESS: // case TokenNameGREATER: // case TokenNameLESS_EQUAL: @@ -2682,7 +2894,8 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // case TokenNameOR: // case TokenNameOR_OR: // case TokenNameAND_AND: - // // the ; is not the expected token ==> it ends a statement when an expression is not ended + // // the ; is not the expected token ==> it ends a statement when an + // expression is not ended // problemReporter().invalidExpressionAsStatement(expressionStack[expressionPtr]); // break; // case TokenNameRBRACE : @@ -2696,11 +2909,11 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // tokenSource = new char[] {}; // } // problemReporter().parseError( - // this.scanner.startPosition, - // this.scanner.currentPosition - 1, - // tokenSource, - // tokenName, - // expectings); + // this.scanner.startPosition, + // this.scanner.currentPosition - 1, + // tokenSource, + // tokenName, + // expectings); // this.checkAndReportBracketAnomalies(problemReporter()); // } // } else { @@ -2708,15 +2921,14 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par try { tokenSource = this.scanner.getCurrentTokenSource(); } catch (Exception e) { - tokenSource = new char[] { - }; + tokenSource = new char[]{}; } // problemReporter().parseError( - // this.scanner.startPosition, - // this.scanner.currentPosition - 1, - // tokenSource, - // tokenName, - // expectings); + // this.scanner.startPosition, + // this.scanner.currentPosition - 1, + // tokenSource, + // tokenName, + // expectings); this.checkAndReportBracketAnomalies(problemReporter()); // } // } @@ -2728,7 +2940,6 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par public static final int SquareBracket = 1; public static final int CurlyBracket = 2; public static final int BracketKinds = 3; - protected int[] nestedMethod; //the ptr is nestedType protected int nestedType, dimensions; //ast stack @@ -2738,20 +2949,21 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par protected int astLengthPtr; protected int[] astLengthStack; AstNode[] noAstNodes = new AstNode[AstStackIncrement]; - - public CompilationUnitDeclaration compilationUnit; /*the result from parse()*/ + public CompilationUnitDeclaration compilationUnit; /* + * the result from parse() + */ protected ReferenceContext referenceContext; protected ProblemReporter problemReporter; // protected CompilationResult compilationResult; - /** - * Returns this parser's problem reporter initialized with its reference context. - * Also it is assumed that a problem is going to be reported, so initializes - * the compilation result's line positions. + * Returns this parser's problem reporter initialized with its reference + * context. Also it is assumed that a problem is going to be reported, so + * initializes the compilation result's line positions. */ public ProblemReporter problemReporter() { if (scanner.recordLineSeparator) { - compilationUnit.compilationResult.lineSeparatorPositions = scanner.getLineEnds(); + compilationUnit.compilationResult.lineSeparatorPositions = scanner + .getLineEnds(); } problemReporter.referenceContext = referenceContext; return problemReporter; @@ -2760,47 +2972,62 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par * Reconsider the entire source looking for inconsistencies in {} () [] */ public boolean checkAndReportBracketAnomalies(ProblemReporter problemReporter) { - scanner.wasAcr = false; boolean anomaliesDetected = false; try { char[] source = scanner.source; - int[] leftCount = { 0, 0, 0 }; - int[] rightCount = { 0, 0, 0 }; - int[] depths = { 0, 0, 0 }; - int[][] leftPositions = new int[][] { new int[10], new int[10], new int[10] }; - int[][] leftDepths = new int[][] { new int[10], new int[10], new int[10] }; - int[][] rightPositions = new int[][] { new int[10], new int[10], new int[10] }; - int[][] rightDepths = new int[][] { new int[10], new int[10], new int[10] }; - scanner.currentPosition = scanner.initialPosition; //starting point (first-zero-based char) - while (scanner.currentPosition < scanner.eofPosition) { //loop for jumping over comments + int[] leftCount = {0, 0, 0}; + int[] rightCount = {0, 0, 0}; + int[] depths = {0, 0, 0}; + int[][] leftPositions = new int[][]{new int[10], new int[10], new int[10]}; + int[][] leftDepths = new int[][]{new int[10], new int[10], new int[10]}; + int[][] rightPositions = new int[][]{new int[10], new int[10], + new int[10]}; + int[][] rightDepths = new int[][]{new int[10], new int[10], new int[10]}; + scanner.currentPosition = scanner.initialPosition; //starting + // point + // (first-zero-based + // char) + while (scanner.currentPosition < scanner.eofPosition) { //loop for + // jumping + // over + // comments try { - // ---------Consume white space and handles startPosition--------- + // ---------Consume white space and handles + // startPosition--------- boolean isWhiteSpace; do { scanner.startPosition = scanner.currentPosition; - // if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) { + // if (((scanner.currentCharacter = + // source[scanner.currentPosition++]) == '\\') && + // (source[scanner.currentPosition] == 'u')) { // isWhiteSpace = scanner.jumpOverUnicodeWhiteSpace(); // } else { - if (scanner.recordLineSeparator && ((scanner.currentCharacter == '\r') || (scanner.currentCharacter == '\n'))) { + if (scanner.recordLineSeparator + && ((scanner.currentCharacter == '\r') || (scanner.currentCharacter == '\n'))) { if (scanner.lineEnds[scanner.linePtr] < scanner.startPosition) { - // only record line positions we have not recorded yet + // only record line positions we have not + // recorded yet scanner.pushLineSeparator(); } } isWhiteSpace = CharOperation.isWhitespace(scanner.currentCharacter); // } - } while (isWhiteSpace && (scanner.currentPosition < scanner.eofPosition)); - + } while (isWhiteSpace + && (scanner.currentPosition < scanner.eofPosition)); // -------consume token until } is found--------- - switch (scanner.currentCharacter) { case '{' : { int index = leftCount[CurlyBracket]++; if (index == leftPositions[CurlyBracket].length) { - System.arraycopy(leftPositions[CurlyBracket], 0, (leftPositions[CurlyBracket] = new int[index * 2]), 0, index); - System.arraycopy(leftDepths[CurlyBracket], 0, (leftDepths[CurlyBracket] = new int[index * 2]), 0, index); + System.arraycopy(leftPositions[CurlyBracket], 0, + (leftPositions[CurlyBracket] = new int[index * 2]), 0, + index); + System + .arraycopy(leftDepths[CurlyBracket], 0, + (leftDepths[CurlyBracket] = new int[index * 2]), 0, + index); } leftPositions[CurlyBracket][index] = scanner.startPosition; leftDepths[CurlyBracket][index] = depths[CurlyBracket]++; @@ -2810,8 +3037,12 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par { int index = rightCount[CurlyBracket]++; if (index == rightPositions[CurlyBracket].length) { - System.arraycopy(rightPositions[CurlyBracket], 0, (rightPositions[CurlyBracket] = new int[index * 2]), 0, index); - System.arraycopy(rightDepths[CurlyBracket], 0, (rightDepths[CurlyBracket] = new int[index * 2]), 0, index); + System.arraycopy(rightPositions[CurlyBracket], 0, + (rightPositions[CurlyBracket] = new int[index * 2]), 0, + index); + System.arraycopy(rightDepths[CurlyBracket], 0, + (rightDepths[CurlyBracket] = new int[index * 2]), 0, + index); } rightPositions[CurlyBracket][index] = scanner.startPosition; rightDepths[CurlyBracket][index] = --depths[CurlyBracket]; @@ -2821,8 +3052,13 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par { int index = leftCount[RoundBracket]++; if (index == leftPositions[RoundBracket].length) { - System.arraycopy(leftPositions[RoundBracket], 0, (leftPositions[RoundBracket] = new int[index * 2]), 0, index); - System.arraycopy(leftDepths[RoundBracket], 0, (leftDepths[RoundBracket] = new int[index * 2]), 0, index); + System.arraycopy(leftPositions[RoundBracket], 0, + (leftPositions[RoundBracket] = new int[index * 2]), 0, + index); + System + .arraycopy(leftDepths[RoundBracket], 0, + (leftDepths[RoundBracket] = new int[index * 2]), 0, + index); } leftPositions[RoundBracket][index] = scanner.startPosition; leftDepths[RoundBracket][index] = depths[RoundBracket]++; @@ -2832,8 +3068,12 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par { int index = rightCount[RoundBracket]++; if (index == rightPositions[RoundBracket].length) { - System.arraycopy(rightPositions[RoundBracket], 0, (rightPositions[RoundBracket] = new int[index * 2]), 0, index); - System.arraycopy(rightDepths[RoundBracket], 0, (rightDepths[RoundBracket] = new int[index * 2]), 0, index); + System.arraycopy(rightPositions[RoundBracket], 0, + (rightPositions[RoundBracket] = new int[index * 2]), 0, + index); + System.arraycopy(rightDepths[RoundBracket], 0, + (rightDepths[RoundBracket] = new int[index * 2]), 0, + index); } rightPositions[RoundBracket][index] = scanner.startPosition; rightDepths[RoundBracket][index] = --depths[RoundBracket]; @@ -2843,8 +3083,12 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par { int index = leftCount[SquareBracket]++; if (index == leftPositions[SquareBracket].length) { - System.arraycopy(leftPositions[SquareBracket], 0, (leftPositions[SquareBracket] = new int[index * 2]), 0, index); - System.arraycopy(leftDepths[SquareBracket], 0, (leftDepths[SquareBracket] = new int[index * 2]), 0, index); + System.arraycopy(leftPositions[SquareBracket], 0, + (leftPositions[SquareBracket] = new int[index * 2]), 0, + index); + System.arraycopy(leftDepths[SquareBracket], 0, + (leftDepths[SquareBracket] = new int[index * 2]), 0, + index); } leftPositions[SquareBracket][index] = scanner.startPosition; leftDepths[SquareBracket][index] = depths[SquareBracket]++; @@ -2854,8 +3098,12 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par { int index = rightCount[SquareBracket]++; if (index == rightPositions[SquareBracket].length) { - System.arraycopy(rightPositions[SquareBracket], 0, (rightPositions[SquareBracket] = new int[index * 2]), 0, index); - System.arraycopy(rightDepths[SquareBracket], 0, (rightDepths[SquareBracket] = new int[index * 2]), 0, index); + System.arraycopy(rightPositions[SquareBracket], 0, + (rightPositions[SquareBracket] = new int[index * 2]), 0, + index); + System.arraycopy(rightDepths[SquareBracket], 0, + (rightDepths[SquareBracket] = new int[index * 2]), 0, + index); } rightPositions[SquareBracket][index] = scanner.startPosition; rightDepths[SquareBracket][index] = --depths[SquareBracket]; @@ -2867,7 +3115,11 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par scanner.scanEscapeCharacter(); } else { // consume next character scanner.unicodeAsBackSlash = false; - // if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) { + // if (((scanner.currentCharacter = + // source[scanner.currentPosition++]) == + // '\\') && + // (source[scanner.currentPosition] == + // 'u')) { // scanner.getNextUnicodeChar(); // } else { if (scanner.withoutUnicodePtr != 0) { @@ -2878,9 +3130,12 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par scanner.getNextChar('\''); break; } - case '"' : // consume next character + case '"' : + // consume next character scanner.unicodeAsBackSlash = false; - // if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) { + // if (((scanner.currentCharacter = + // source[scanner.currentPosition++]) == '\\') && + // (source[scanner.currentPosition] == 'u')) { // scanner.getNextUnicodeChar(); // } else { if (scanner.withoutUnicodePtr != 0) { @@ -2891,17 +3146,22 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par if (scanner.currentCharacter == '\r') { if (source[scanner.currentPosition] == '\n') scanner.currentPosition++; - break; // the string cannot go further that the line + break; // the string cannot go further that + // the line } if (scanner.currentCharacter == '\n') { - break; // the string cannot go further that the line + break; // the string cannot go further that + // the line } if (scanner.currentCharacter == '\\') { scanner.scanEscapeCharacter(); } // consume next character scanner.unicodeAsBackSlash = false; - // if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) { + // if (((scanner.currentCharacter = + // source[scanner.currentPosition++]) == '\\') + // && (source[scanner.currentPosition] == 'u')) + // { // scanner.getNextUnicodeChar(); // } else { if (scanner.withoutUnicodePtr != 0) { @@ -2913,70 +3173,98 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par case '/' : { int test; - if ((test = scanner.getNextChar('/', '*')) == 0) { //line comment - //get the next char - if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) { - //-------------unicode traitement ------------ + if ((test = scanner.getNextChar('/', '*')) == 0) { //line + // comment + //get the next char + if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') + && (source[scanner.currentPosition] == 'u')) { + //-------------unicode traitement + // ------------ int c1 = 0, c2 = 0, c3 = 0, c4 = 0; scanner.currentPosition++; while (source[scanner.currentPosition] == 'u') { scanner.currentPosition++; } - if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c1 < 0 - || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c2 < 0 - || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c3 < 0 - || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c4 < 0) { //error don't care of the value + if ((c1 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c1 < 0 + || (c2 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c2 < 0 + || (c3 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c3 < 0 + || (c4 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c4 < 0) { //error don't + // care of the + // value scanner.currentCharacter = 'A'; } //something different from \n and \r else { scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4); } } - while (scanner.currentCharacter != '\r' && scanner.currentCharacter != '\n') { + while (scanner.currentCharacter != '\r' + && scanner.currentCharacter != '\n') { //get the next char scanner.startPosition = scanner.currentPosition; - if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) { - //-------------unicode traitement ------------ + if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') + && (source[scanner.currentPosition] == 'u')) { + //-------------unicode traitement + // ------------ int c1 = 0, c2 = 0, c3 = 0, c4 = 0; scanner.currentPosition++; while (source[scanner.currentPosition] == 'u') { scanner.currentPosition++; } - if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c1 < 0 - || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c2 < 0 - || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c3 < 0 - || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c4 < 0) { //error don't care of the value + if ((c1 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c1 < 0 + || (c2 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c2 < 0 + || (c3 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c3 < 0 + || (c4 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c4 < 0) { //error don't + // care of the + // value scanner.currentCharacter = 'A'; - } //something different from \n and \r + } //something different from \n + // and \r else { scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4); } } } - if (scanner.recordLineSeparator && ((scanner.currentCharacter == '\r') || (scanner.currentCharacter == '\n'))) { + if (scanner.recordLineSeparator + && ((scanner.currentCharacter == '\r') || (scanner.currentCharacter == '\n'))) { if (scanner.lineEnds[scanner.linePtr] < scanner.startPosition) { - // only record line positions we have not recorded yet + // only record line positions we + // have not recorded yet scanner.pushLineSeparator(); if (this.scanner.taskTags != null) { - this.scanner.checkTaskTag(this.scanner.getCurrentTokenStartPosition(), this.scanner.getCurrentTokenEndPosition()); + this.scanner.checkTaskTag(this.scanner + .getCurrentTokenStartPosition(), this.scanner + .getCurrentTokenEndPosition()); } } } break; } - if (test > 0) { //traditional and annotation comment + if (test > 0) { //traditional and annotation + // comment boolean star = false; // consume next character scanner.unicodeAsBackSlash = false; - // if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) { + // if (((scanner.currentCharacter = + // source[scanner.currentPosition++]) == + // '\\') && + // (source[scanner.currentPosition] == + // 'u')) { // scanner.getNextUnicodeChar(); // } else { if (scanner.withoutUnicodePtr != 0) { @@ -2986,56 +3274,75 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par if (scanner.currentCharacter == '*') { star = true; } - //get the next char - if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) { - //-------------unicode traitement ------------ + //get the next char + if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') + && (source[scanner.currentPosition] == 'u')) { + //-------------unicode traitement + // ------------ int c1 = 0, c2 = 0, c3 = 0, c4 = 0; scanner.currentPosition++; while (source[scanner.currentPosition] == 'u') { scanner.currentPosition++; } - if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c1 < 0 - || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c2 < 0 - || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c3 < 0 - || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c4 < 0) { //error don't care of the value + if ((c1 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c1 < 0 + || (c2 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c2 < 0 + || (c3 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c3 < 0 + || (c4 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c4 < 0) { //error don't + // care of the + // value scanner.currentCharacter = 'A'; } //something different from * and / else { scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4); } } - //loop until end of comment */ + //loop until end of comment */ while ((scanner.currentCharacter != '/') || (!star)) { star = scanner.currentCharacter == '*'; //get next char - if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) { - //-------------unicode traitement ------------ + if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') + && (source[scanner.currentPosition] == 'u')) { + //-------------unicode traitement + // ------------ int c1 = 0, c2 = 0, c3 = 0, c4 = 0; scanner.currentPosition++; while (source[scanner.currentPosition] == 'u') { scanner.currentPosition++; } - if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c1 < 0 - || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c2 < 0 - || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c3 < 0 - || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 - || c4 < 0) { //error don't care of the value + if ((c1 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c1 < 0 + || (c2 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c2 < 0 + || (c3 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c3 < 0 + || (c4 = Character + .getNumericValue(source[scanner.currentPosition++])) > 15 + || c4 < 0) { //error don't + // care of the + // value scanner.currentCharacter = 'A'; - } //something different from * and / + } //something different from * and + // / else { scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4); } } } if (this.scanner.taskTags != null) { - this.scanner.checkTaskTag(this.scanner.getCurrentTokenStartPosition(), this.scanner.getCurrentTokenEndPosition()); + this.scanner.checkTaskTag(this.scanner + .getCurrentTokenStartPosition(), this.scanner + .getCurrentTokenEndPosition()); } break; } @@ -3051,7 +3358,8 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par break; } } - //-----------------end switch while try-------------------- + //-----------------end switch while + // try-------------------- } catch (IndexOutOfBoundsException e) { break; // read until EOF } catch (InvalidInputException e) { @@ -3059,31 +3367,35 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par } } if (scanner.recordLineSeparator) { - // compilationUnit.compilationResult.lineSeparatorPositions = scanner.getLineEnds(); + // compilationUnit.compilationResult.lineSeparatorPositions = + // scanner.getLineEnds(); } - // check placement anomalies against other kinds of brackets for (int kind = 0; kind < BracketKinds; kind++) { for (int leftIndex = leftCount[kind] - 1; leftIndex >= 0; leftIndex--) { - int start = leftPositions[kind][leftIndex]; // deepest first + int start = leftPositions[kind][leftIndex]; // deepest + // first // find matching closing bracket int depth = leftDepths[kind][leftIndex]; int end = -1; for (int i = 0; i < rightCount[kind]; i++) { int pos = rightPositions[kind][i]; - // want matching bracket further in source with same depth + // want matching bracket further in source with same + // depth if ((pos > start) && (depth == rightDepths[kind][i])) { end = pos; break; } } if (end < 0) { // did not find a good closing match - problemReporter.unmatchedBracket(start, referenceContext, compilationUnit.compilationResult); + problemReporter.unmatchedBracket(start, referenceContext, + compilationUnit.compilationResult); return true; } - // check if even number of opening/closing other brackets in between this pair of brackets + // check if even number of opening/closing other brackets + // in between this pair of brackets int balance = 0; - for (int otherKind = 0;(balance == 0) && (otherKind < BracketKinds); otherKind++) { + for (int otherKind = 0; (balance == 0) && (otherKind < BracketKinds); otherKind++) { for (int i = 0; i < leftCount[otherKind]; i++) { int pos = leftPositions[otherKind][i]; if ((pos > start) && (pos < end)) @@ -3095,7 +3407,9 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par balance--; } if (balance != 0) { - problemReporter.unmatchedBracket(start, referenceContext, compilationUnit.compilationResult); //bracket anomaly + problemReporter.unmatchedBracket(start, referenceContext, + compilationUnit.compilationResult); //bracket + // anomaly return true; } } @@ -3103,17 +3417,18 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par // too many opening brackets ? for (int i = rightCount[kind]; i < leftCount[kind]; i++) { anomaliesDetected = true; - problemReporter.unmatchedBracket(leftPositions[kind][leftCount[kind] - i - 1], referenceContext, compilationUnit.compilationResult); + problemReporter.unmatchedBracket(leftPositions[kind][leftCount[kind] + - i - 1], referenceContext, compilationUnit.compilationResult); } // too many closing brackets ? for (int i = leftCount[kind]; i < rightCount[kind]; i++) { anomaliesDetected = true; - problemReporter.unmatchedBracket(rightPositions[kind][i], referenceContext, compilationUnit.compilationResult); + problemReporter.unmatchedBracket(rightPositions[kind][i], + referenceContext, compilationUnit.compilationResult); } if (anomaliesDetected) return true; } - return anomaliesDetected; } catch (ArrayStoreException e) { // jdk1.2.2 jit bug return anomaliesDetected; @@ -3121,7 +3436,6 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par return anomaliesDetected; } } - protected void pushOnAstLengthStack(int pos) { try { astLengthStack[++astLengthPtr] = pos; @@ -3133,11 +3447,10 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par astLengthStack[astLengthPtr] = pos; } } - protected void pushOnAstStack(AstNode node) { - /*add a new obj on top of the ast stack - astPtr points on the top*/ - + /* + * add a new obj on top of the ast stack + */ try { astStack[++astPtr] = node; } catch (IndexOutOfBoundsException e) { @@ -3148,7 +3461,6 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols, Par astPtr = oldStackLength; astStack[astPtr] = node; } - try { astLengthStack[++astLengthPtr] = 1; } catch (IndexOutOfBoundsException e) { -- 1.7.1