X-Git-Url: http://git.phpeclipse.com 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 8a9f5e1..99ead74 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 @@ -11,29 +11,23 @@ Contributors: package net.sourceforge.phpdt.internal.compiler.parser; import java.util.ArrayList; -import java.util.Hashtable; -import net.sourceforge.phpdt.core.compiler.*; +import net.sourceforge.phpdt.core.compiler.ITerminalSymbols; +import net.sourceforge.phpdt.core.compiler.InvalidInputException; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import net.sourceforge.phpeclipse.phpeditor.PHPString; import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.ui.texteditor.MarkerUtilities; + import test.PHPParserSuperclass; public class Parser extends PHPParserSuperclass implements ITerminalSymbols { - public static final int ERROR = 2; - public static final int WARNING = 1; - public static final int INFO = 0; - - //scanner token + //scanner token public Scanner scanner; - private IFile fileToParse; private ArrayList phpList; private int currentPHPString; @@ -148,7 +142,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { public void setFileToParse(IFile fileToParse) { this.currentPHPString = 0; - this.fileToParse = fileToParse; + PHPParserSuperclass.fileToParse = fileToParse; this.phpList = null; this.str = ""; this.token = TokenNameEOF; @@ -156,7 +150,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { this.initializeScanner(); } /** - * Class Constructor. + * ClassDeclaration Constructor. * *@param s *@param sess Description of Parameter @@ -170,7 +164,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { // } // } this.currentPHPString = 0; - this.fileToParse = fileToParse; + PHPParserSuperclass.fileToParse = fileToParse; this.phpList = null; this.str = ""; this.token = TokenNameEOF; @@ -189,45 +183,10 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { /** * Create marker for the parse error */ - private void setMarker( - String message, - int charStart, - int charEnd, - int errorLevel) - throws CoreException { + private void setMarker(String message, int charStart, int charEnd, int errorLevel) throws CoreException { setMarker(fileToParse, message, charStart, charEnd, errorLevel); } - public static void setMarker( - IFile file, - String message, - int charStart, - int charEnd, - int errorLevel) - throws CoreException { - if (file != null) { - Hashtable attributes = new Hashtable(); - MarkerUtilities.setMessage(attributes, message); - switch (errorLevel) { - case ERROR : - attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR)); - break; - case WARNING : - attributes.put( - IMarker.SEVERITY, - new Integer(IMarker.SEVERITY_WARNING)); - break; - case INFO : - attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_INFO)); - break; - } - MarkerUtilities.setCharStart(attributes, charStart); - MarkerUtilities.setCharEnd(attributes, charEnd); - // setLineNumber(attributes, lineNumber); - MarkerUtilities.createMarker(file, attributes, IMarker.PROBLEM); - } - } - /** * This method will throw the SyntaxError. * It will add the good lines and columns to the Error @@ -294,8 +253,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { 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) { @@ -303,617 +261,8 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } return; - // boolean phpFound = false; - // char ch2; - // - // phpEnd = false; - // try { - // if (!phpMode) { - // - // while (str.length() > chIndx) { - // token = TokenNameERROR; - // ch = str.charAt(chIndx++); - // - // if (ch == '\n') { - // rowCount++; - // } - // if (ch == '<') { - // ch2 = str.charAt(chIndx++); - // if (ch2 == '?') { - // ch2 = str.charAt(chIndx++); - // if (Character.isWhitespace(ch2)) { - // // php start - // phpMode = true; - // phpFound = true; - // break; - // } else if (ch2 == 'p' || ch2 == 'P') { - // ch2 = str.charAt(chIndx++); - // if (ch2 == 'h' || ch2 == 'H') { - // ch2 = str.charAt(chIndx++); - // if (ch2 == 'p' || ch2 == 'P') { - // phpMode = true; - // phpFound = true; - // break; - // } - // chIndx--; - // } - // chIndx--; - // } - // chIndx--; - // } - // chIndx--; - // } - // } - // - // } - // - // if (phpMode) { - // while (str.length() > chIndx) { - // ch = str.charAt(chIndx++); - // token = TokenNameERROR; - // if (ch == '\n') { - // rowCount++; - // columnCount = chIndx; - // continue; // while loop - // } - // if (str.length() == chIndx) { - // phpEnd = true; - // } - // if (!Character.isWhitespace(ch)) { - // if (ch == '$') { - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '{') { - // chIndx++; - // token = TokenNameDOLLAROPEN; - // return; - // } - // } - // getIdentifier(); - // return; - // } - // if ((ch >= 'a' && ch <= 'z') - // || (ch >= 'A' && ch <= 'Z') - // || (ch == '_') - // || (ch == '$')) { - // getIdentifier(); - // return; - // } - // if (ch >= '0' && ch <= '9') { - // getNumber(); - // return; - // } - // if (ch == '/') { - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '/') { - // ch = '/'; - // chIndx++; - // // read comment until end of line: - // while ((str.length() > chIndx) - // && (ch != '\n')) { - // ch = str.charAt(chIndx++); - // if (ch == '?') { - // ch2 = str.charAt(chIndx); - // if (ch2 == '>') { - // chIndx++; - // token = TokenNameHTML; - // // php end - // phpMode = false; - // phpEnd = true; - // return; - // } - // } - // } - // rowCount++; - // continue; - // - // } else if (str.charAt(chIndx) == '*') { - // chIndx++; - // // multi line comment: - // while (str.length() > chIndx) { - // if (str.charAt(chIndx) == '*' - // && (str.length() > (chIndx + 1)) - // && str.charAt(chIndx + 1) == '/') { - // chIndx += 2; - // break; - // } - // ch = str.charAt(chIndx++); - // if (ch == '\n') { - // rowCount++; - // columnCount = chIndx; - // } - // } - // continue; - // } - // } - // } else if (ch == '#') { - // // read comment until end of line: - // while ((str.length() > chIndx) && (ch != '\n')) { - // ch = str.charAt(chIndx++); - // if (ch == '?') { - // ch2 = str.charAt(chIndx); - // if (ch2 == '>') { - // chIndx++; - // token = TokenNameHTML; - // // php end - // phpMode = false; - // phpEnd = true; - // return; - // } - // } - // } - // rowCount++; - // continue; - // - // } else if (ch == '"') { - // getString( - // '"', - // TokenNameStringInterpolated, - // "Open string character '\"' at end of file."); - // return; - // } else if (ch == '\'') { - // getString( - // '\'', - // TokenNameStringConstant, - // "Open string character \"'\" at end of file."); - // return; - // } else if (ch == '`') { - // getString( - // '`', - // TokenNameStringConstant, - // "Open string character \"`\" at end of file."); - // setMarker( - // "Other string delimiters prefered (found \"`\").", - // rowCount, - // PHPParser.INFO); - // return; - // } - // - // switch (ch) { - // - // case '(' : - // token = TokenNameLPAREN; - // - // break; - // case ')' : - // token = TokenNameRPAREN; - // - // break; - // case '{' : - // token = TokenNameLBRACE; - // - // break; - // case '}' : - // token = TokenNameRBRACE; - // - // break; - // case '[' : - // token = TokenNameLBRACKET; - // - // break; - // case ']' : - // token = TokenNameRBRACKET; - // - // break; - // case ',' : - // token = TokenNameCOMMA; - // - // break; - // case '?' : - // token = TokenNameQUESTION; - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '>') { - // chIndx++; - // token = TokenNameHTML; - // // php end - // phpMode = false; - // phpEnd = true; - // break; - // } - // } - // - // break; - // case '@' : - // token = TokenNameAT; - // break; - // case '~' : - // token = TokenNameTWIDDLE; - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNameTWIDDLE_EQUAL; - // - // break; - // } - // } - // break; - // case '.' : - // token = TokenNameDOT; - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNameDOT_EQUAL; - // - // break; - // } - // } - // - // break; - // case '"' : - // token = TokenNameStringLiteral; - // - // break; - // case '%' : - // token = TokenNameREMAINDER; - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNameREMAINDER_EQUAL; - // - // break; - // } - // } - // break; - // case ';' : - // token = TokenNameSEMICOLON; - // - // break; - // case '^' : - // token = TokenNameXOR; - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNameXOR_EQUAL; - // - // break; - // } - // } - // break; - // case '/' : - // token = TokenNameDIVIDE; - // - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNameDIVIDE_EQUAL; - // - // break; - // } - // } - // - // break; - // case '*' : - // token = TokenNameMULTIPLY; - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '*') { - // chIndx++; - // token = TokenNameXOR; - // - // break; - // } - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNameMULTIPLY_EQUAL; - // - // break; - // } - // } - // - // break; - // case '+' : - // token = TokenNamePLUS; - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '+') { - // chIndx++; - // token = TokenNamePLUS_PLUS; - // - // break; - // } - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNamePLUS_EQUAL; - // - // break; - // } - // } - // break; - // case '-' : - // token = TokenNameMINUS; - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '-') { - // chIndx++; - // token = TokenNameMINUS_MINUS; - // - // break; - // } - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNameMINUS_EQUAL; - // - // break; - // } - // if (str.charAt(chIndx) == '>') { - // chIndx++; - // token = TokenNameMINUS_GREATER; - // - // break; - // } - // } - // - // break; - // case '=' : - // token = TokenNameEQUAL; - // - // if (str.length() > chIndx) { - // ch = str.charAt(chIndx); - // - // if (ch == '=') { - // chIndx++; - // token = TokenNameEQUAL_EQUAL; - // if (str.length() > chIndx) { - // ch = str.charAt(chIndx); - // - // if (ch == '=') { - // chIndx++; - // token = - // TokenNameEQUAL_EQUAL_EQUAL; - // } - // } - // break; - // } - // if (ch == '>') { - // chIndx++; - // token = TokenNameEQUAL_GREATER; - // - // break; - // } - // } - // - // break; - // case '!' : - // token = TokenNameNOT; - // - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNameNOT_EQUAL; - // if (str.length() > chIndx) { - // ch = str.charAt(chIndx); - // - // if (ch == '=') { - // chIndx++; - // token = - // TokenNameNOT_EQUAL_EQUAL; - // } - // } - // break; - // } - // } - // - // break; - // case '>' : - // token = TokenNameGREATER; - // - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNameGREATER_EQUAL; - // break; - // } - // if (str.charAt(chIndx) == '>') { - // chIndx++; - // token = TokenNameRIGHT_SHIFT; - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = - // TokenNameRIGHT_SHIFT_EQUAL; - // break; - // } - // } - // break; - // } - // } - // - // break; - // case '<' : - // token = TokenNameLESS; - // - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNameLESS_EQUAL; - // - // break; - // } - // if (str.charAt(chIndx) == '<') { - // chIndx++; - // token = TokenNameLEFT_SHIFT; - // if (str.charAt(chIndx) == '<') { - // // heredoc - // int startRow = rowCount; - // if (str.length() > chIndx) { - // - // ch = str.charAt(++chIndx); - // if ((ch >= 'a' && ch <= 'z') - // || (ch >= 'A' && ch <= 'Z') - // || (ch == '_')) { - // chIndx++; - // getIdentifier(); - // token = - // TokenNameStringConstant; - // while (str.length() - // > chIndx) { - // ch = - // str.charAt( - // chIndx++); - // if (ch == '\n') { - // if (str.length() - // >= chIndx - // + identifier - // .length()) { - // if (str - // .substring( - // chIndx, - // chIndx - // + identifier - // .length()) - // .equals(identifier)) { - // chIndx - // += identifier - // .length(); - // return; - // } - // } - // } - // } - // } - // } - // throwSyntaxError( - // "Open heredoc syntax after operator '<<<'.", - // startRow); - // } else if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNameLEFT_SHIFT_EQUAL; - // break; - // } - // break; - // } - // } - // - // break; - // - // case '|' : - // token = TokenNameOR; - // - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '|') { - // chIndx++; - // token = TokenNameOR_OR; - // break; - // } - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNameOR_EQUAL; - // break; - // } - // } - // - // break; - // case '&' : - // token = TokenNameAND; - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == '&') { - // chIndx++; - // token = TokenNameAND_AND; - // break; - // } - // if (str.charAt(chIndx) == '=') { - // chIndx++; - // token = TokenNameAND_EQUAL; - // break; - // } - // break; - // } - // - // break; - // case ':' : - // token = TokenNameCOLON; - // if (str.length() > chIndx) { - // if (str.charAt(chIndx) == ':') { - // chIndx++; - // token = TokenNameCOLON_COLON; - // } - // } - // break; - // // case '#' : - // // token = TokenNameHASH; - // // - // // break; - // // case '@' : - // // token = TokenNameAT; - // // - // // break; - // default : - // throwSyntaxError( - // "unexpected character: '" + ch + "'"); - // } - // - // if (token == TokenNameERROR) { - // throwSyntaxError("token not found"); - // } - // - // return; - // } - // } - // } - // } catch (StringIndexOutOfBoundsException e) { - // // catched from charAt - // } - // - // chIndx = str.length() + 1; - // ch = ' '; - // token = TokenNameEOF; - // phpEnd = true; - // //PHPString temp; - // // if (phpList != null) { - // // if (currentPHPString < phpList.size()) { - // // token = TokenNameUNDEFINED; - // // temp = (PHPString) phpList.get(currentPHPString++); - // // this.str = temp.getPHPString(); - // // this.token = TokenNameEOF; - // // this.chIndx = 0; - // // this.rowCount = temp.getLineNumber(); - // // this.columnCount = 0; - // // getNextToken(); - // // phpEnd = true; - // // } else { - // // token = TokenNameUNDEFINED; - // // return; - // // } - // // } } - // /** - // * Get an identifier. - // */ - // private void getIdentifier() { - // // StringBuffer ident = new StringBuffer(); - // int startPosition = chIndx - 1; - // // ident.append(ch); - // if (ch == '$') { - // getChar(); - // // attention recursive call: - // getIdentifier(); - // token = TokenNameVariable; - // return; - // } else { - // token = TokenNameIdentifier; - // } - // - // getChar(); - // - // //this will read the buffer until the next character is a forbidden character for identifier - // while ((ch >= 'a' && ch <= 'z') - // || (ch >= 'A' && ch <= 'Z') - // || (ch >= '0' && ch <= '9') - // || (ch == '_')) { - // // ident.append(ch); - // getChar(); - // } - // int endPosition = chIndx--; - // int length = (--endPosition) - startPosition; - // - // identifier = str.substring(startPosition, endPosition); - // // System.out.println(identifier); - // - // // determine if this identitfer is a keyword - // // @todo improve this in future version - // Integer i = (Integer) keywordMap.get(identifier.toLowerCase()); - // if (i != null) { - // token = i.intValue(); - // } - // } - /** * Get a number. * if it's a double the number will be stored in doubleNumber and the token will have the @@ -1286,10 +635,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } if (token != TokenNameEOF) { if (token == TokenNameERROR) { - throwSyntaxError( - "Scanner error (Found unknown token: " - + scanner.toStringAction(token) - + ")"); + throwSyntaxError("Scanner error (Found unknown token: " + scanner.toStringAction(token) + ")"); } if (token == TokenNameRPAREN) { throwSyntaxError("Too many closing ')'; end-of-file not reached."); @@ -1319,11 +665,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { throw err; } else { // setMarker(err.getMessage(), err.getLine(), ERROR); - setMarker( - err.getMessage(), - scanner.getCurrentTokenStartPosition(), - scanner.getCurrentTokenEndPosition(), - ERROR); + setMarker(err.getMessage(), scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition(), ERROR); } // if an error occured, // try to find keywords 'class' or 'function' @@ -1365,10 +707,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } if (token != TokenNameEOF) { if (token == TokenNameERROR) { - throwSyntaxError( - "Scanner error (Found unknown token: " - + scanner.toStringAction(token) - + ")"); + throwSyntaxError("Scanner error (Found unknown token: " + scanner.toStringAction(token) + ")"); } if (token == TokenNameRPAREN) { throwSyntaxError("Too many closing ')'; end-of-file not reached."); @@ -1395,11 +734,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { return; } catch (SyntaxError sytaxErr1) { // setMarker(sytaxErr1.getMessage(), sytaxErr1.getLine(), ERROR); - setMarker( - sytaxErr1.getMessage(), - scanner.getCurrentTokenStartPosition(), - scanner.getCurrentTokenEndPosition(), - ERROR); + setMarker(sytaxErr1.getMessage(), scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition(), ERROR); try { // if an error occured, // try to find keywords 'class' or 'function' @@ -1415,11 +750,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } } catch (SyntaxError sytaxErr2) { // setMarker(sytaxErr2.getMessage(), sytaxErr2.getLine(), ERROR); - setMarker( - sytaxErr2.getMessage(), - scanner.getCurrentTokenStartPosition(), - scanner.getCurrentTokenEndPosition(), - ERROR); + setMarker(sytaxErr2.getMessage(), scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition(), ERROR); return; } } @@ -1450,10 +781,11 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { return outlineInfo; } - private void parseDeclarations( - PHPOutlineInfo outlineInfo, - PHPSegmentWithChildren current, - boolean goBack) { + private boolean isVariable() { + return token == TokenNameVariable || token == TokenNamethis; + } + + private void parseDeclarations(PHPOutlineInfo outlineInfo, OutlineableWithChildren current, boolean goBack) { char[] ident; // PHPClassDeclaration current = (PHPClassDeclaration) stack.peek(); PHPSegmentWithChildren temp; @@ -1468,10 +800,10 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { getNextToken(); } else if (token == TokenNamevar) { getNextToken(); - if (token == TokenNameVariable - && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_VAR)) { + if (token == TokenNameVariable && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_VAR)) { ident = scanner.getCurrentIdentifierSource(); - String variableName = new String(ident); + //substring(1) added because PHPVarDeclaration doesn't need the $ anymore + String variableName = new String(ident).substring(1); outlineInfo.addVariable(variableName); getNextToken(); if (token != TokenNameSEMICOLON) { @@ -1485,6 +817,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } else { switch (token) { case TokenNameVariable : + case TokenNamethis : current.add(new PHPVarDeclaration(current, variableName, // chIndx - ident.length, scanner.getCurrentTokenStartPosition(), new String(ident))); @@ -1495,10 +828,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { scanner.getCurrentTokenStartPosition(), new String(ident))); break; case TokenNameDoubleLiteral : - current - .add(new PHPVarDeclaration( - current, - variableName + doubleNumber, + current.add(new PHPVarDeclaration(current, variableName + doubleNumber, // chIndx - ident.length, scanner.getCurrentTokenStartPosition(), new String(ident))); break; @@ -1539,8 +869,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { if (token == TokenNameAND) { getNextToken(); } - if (token == TokenNameIdentifier - && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_FUNC)) { + if (token == TokenNameIdentifier && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_FUNC)) { ident = scanner.getCurrentIdentifierSource(); outlineInfo.addVariable(new String(ident)); temp = new PHPFunctionDeclaration(current, new String(ident), @@ -1552,8 +881,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } } else if (token == TokenNameclass) { getNextToken(); - if (token == TokenNameIdentifier - && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_CLASS)) { + if (token == TokenNameIdentifier && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_CLASS)) { ident = scanner.getCurrentIdentifierSource(); outlineInfo.addVariable(new String(ident)); temp = new PHPClassDeclaration(current, new String(ident), @@ -1564,15 +892,13 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { getNextToken(); //skip tokens for classname, extends and others until we have the opening '{' - while (token != TokenNameLBRACE - && token != TokenNameEOF - && token != TokenNameERROR) { + while (token != TokenNameLBRACE && token != TokenNameEOF && token != TokenNameERROR) { getNextToken(); } parseDeclarations(outlineInfo, temp, true); // stack.pop(); } - } else if (token == TokenNameLBRACE) { + } else if ((token == TokenNameLBRACE) || (token == TokenNameDOLLAR_LBRACE)) { getNextToken(); counter++; } else if (token == TokenNameRBRACE) { @@ -1605,11 +931,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } catch (SyntaxError sytaxErr) { try { // setMarker(sytaxErr.getMessage(), sytaxErr.getLine(), ERROR); - setMarker( - sytaxErr.getMessage(), - scanner.getCurrentTokenStartPosition(), - scanner.getCurrentTokenEndPosition(), - ERROR); + setMarker(sytaxErr.getMessage(), scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition(), ERROR); } catch (CoreException e) { } } @@ -1617,10 +939,11 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { private void statementList() throws CoreException { do { - statement(); + statement(TokenNameEOF); if ((token == TokenNameRBRACE) || (token == TokenNamecase) || (token == TokenNamedefault) + || (token == TokenNameelse) || (token == TokenNameelseif) || (token == TokenNameendif) || (token == TokenNameendfor) @@ -1651,33 +974,42 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } } - private void statement() throws CoreException { + private void statement(int previousToken) throws CoreException { // if (token > TokenNameKEYWORD && token != TokenNamelist && token != TokenNamenew) { // char[] ident = scanner.getCurrentIdentifierSource(); // String keyword = new String(ident); if (token == TokenNameinclude || token == TokenNameinclude_once) { getNextToken(); - expression(); - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - if (token != TokenNameStopPHP) { - throwSyntaxError("';' character after 'include' or 'include_once' expected."); + if (token == TokenNameLPAREN) { + expression(); + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + if (previousToken != TokenNameAT && token != TokenNameStopPHP) { + throwSyntaxError("';' expected after 'include' or 'include_once'."); + } + // getNextToken(); } - getNextToken(); + } else { + concatenationExpression(); } + return; } else if (token == TokenNamerequire || token == TokenNamerequire_once) { getNextToken(); //constant(); - expression(); - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - if (token != TokenNameStopPHP) { - throwSyntaxError("';' character after 'require' or 'require_once' expected."); + if (token == TokenNameLPAREN) { + expression(); + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + if (previousToken != TokenNameAT && token != TokenNameStopPHP) { + throwSyntaxError("';' expected after 'require' or 'require_once'."); + } + // getNextToken(); } - getNextToken(); + } else { + concatenationExpression(); } return; } else if (token == TokenNameif) { @@ -1831,10 +1163,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { foreachStatement(); return; - } else if ( - token == TokenNamecontinue - || token == TokenNamebreak - || token == TokenNamereturn) { + } else if (token == TokenNamecontinue || token == TokenNamebreak || token == TokenNamereturn) { getNextToken(); if (token != TokenNameSEMICOLON) { expression(); @@ -1989,10 +1318,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { 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(); } @@ -2005,15 +1331,20 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { if (token == TokenNameIdentifier) { getNextToken(); if (token == TokenNameextends) { - getNextToken(); - if (token == TokenNameIdentifier) { + do { getNextToken(); - } else { - throwSyntaxError("Class name expected after keyword 'extends'."); - } + if (token == TokenNameIdentifier) { + getNextToken(); + } else { + throwSyntaxError("ClassDeclaration name expected after keyword 'extends'."); + } + } while (token == TokenNameCOMMA); } } else { - throwSyntaxError("Class name expected after keyword 'class'."); + if (token > TokenNameKEYWORD) { + throwSyntaxError("Don't use keyword for class declaration [" + token + "]."); + } + throwSyntaxError("ClassDeclaration name expected after keyword 'class'."); } } @@ -2065,6 +1396,9 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { constant(); } } else { + if (token == TokenNamethis) { + throwSyntaxError("Reserved word '$this' not allowed after keyword 'var'."); + } throwSyntaxError("Variable expected after keyword 'var'."); } if (token != TokenNameCOMMA) { @@ -2104,6 +1438,11 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } else { getNextToken(); } + } else { + if (token > TokenNameKEYWORD) { + throwSyntaxError("Don't use keyword for function declaration [" + token + "]."); + } + throwSyntaxError("Function name expected after keyword 'function'."); } } // @@ -2124,7 +1463,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { //variable-reference if (token == TokenNameAND) { getNextToken(); - if (token == TokenNameVariable) { + if (isVariable()) { getNextToken(); } else { throwSyntaxError("Variable expected after reference operator '&'."); @@ -2139,6 +1478,9 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } return; } + if (token == TokenNamethis) { + throwSyntaxError("Reserved word '$this' not allowed in parameter declaration."); + } } private void labeledStatementList() throws CoreException { @@ -2148,11 +1490,10 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { do { if (token == TokenNamecase) { getNextToken(); - constant(); + expression(); //constant(); if (token == TokenNameCOLON) { getNextToken(); - if (token == TokenNamecase - || token == TokenNamedefault) { // empty case statement ? + if (token == TokenNamecase || token == TokenNamedefault) { // empty case statement ? continue; } statementList(); @@ -2164,9 +1505,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { // rowCount, // PHPParser.INFO); setMarker( - "':' expected after 'case' keyword (Found token: " - + scanner.toStringAction(token) - + ")", + "':' expected after 'case' keyword (Found token: " + scanner.toStringAction(token) + ")", scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition(), INFO); @@ -2176,10 +1515,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } statementList(); } else { - throwSyntaxError( - "':' character after 'case' constant expected (Found token: " - + scanner.toStringAction(token) - + ")"); + throwSyntaxError("':' character after 'case' constant expected (Found token: " + scanner.toStringAction(token) + ")"); } } else { // TokenNamedefault getNextToken(); @@ -2250,26 +1586,30 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { // ':' statement-list [elseif-list] [else-colon-statement] 'endif' ';' if (token == TokenNameCOLON) { getNextToken(); - statementList(); - switch (token) { - case TokenNameelse : - getNextToken(); - if (token == TokenNameCOLON) { + if (token != TokenNameendif) { + statementList(); + switch (token) { + case TokenNameelse : getNextToken(); - statementList(); - } else { - if (token == TokenNameif) { //'else if' + if (token == TokenNameCOLON) { getNextToken(); - elseifStatementList(); + if (token != TokenNameendif) { + statementList(); + } } else { - throwSyntaxError("':' expected after 'else'."); + if (token == TokenNameif) { //'else if' + getNextToken(); + elseifStatementList(); + } else { + throwSyntaxError("':' expected after 'else'."); + } } - } - break; - case TokenNameelseif : - getNextToken(); - elseifStatementList(); - break; + break; + case TokenNameelseif : + getNextToken(); + elseifStatementList(); + break; + } } if (token != TokenNameendif) { @@ -2282,7 +1622,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { getNextToken(); } else { // statement [else-statement] - statement(); + statement(TokenNameEOF); if (token == TokenNameelseif) { getNextToken(); if (token == TokenNameLPAREN) { @@ -2299,7 +1639,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { ifStatement(); } else if (token == TokenNameelse) { getNextToken(); - statement(); + statement(TokenNameEOF); } } } @@ -2312,7 +1652,9 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { getNextToken(); if (token == TokenNameCOLON) { getNextToken(); - statementList(); + if (token != TokenNameendif) { + statementList(); + } return; } else { if (token == TokenNameif) { //'else if' @@ -2335,7 +1677,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { if (token == TokenNameLPAREN) { getNextToken(); expression(); - if (token != TokenNameLPAREN) { + if (token != TokenNameRPAREN) { throwSyntaxError("')' expected in else-if-statement."); } getNextToken(); @@ -2343,7 +1685,9 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { throwSyntaxError("':' expected in else-if-statement."); } getNextToken(); - statementList(); + if (token != TokenNameendif) { + statementList(); + } } } @@ -2390,7 +1734,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } getNextToken(); } else { - statement(); + statement(TokenNameEOF); } } @@ -2408,7 +1752,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } getNextToken(); } else { - statement(); + statement(TokenNameEOF); } } @@ -2425,7 +1769,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { } getNextToken(); } else { - statement(); + statement(TokenNameEOF); } } @@ -2480,6 +1824,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { // String ident; char[] ident; boolean castFlag = false; + boolean arrayFlag = false; switch (token) { case TokenNamenew : getNextToken(); @@ -2504,6 +1849,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { break; case TokenNameLPAREN : getNextToken(); + if (token == TokenNameIdentifier) { // check if identifier is a type: // ident = identifier; @@ -2512,20 +1858,34 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { for (int i = 0; i < PHP_TYPES.length; i++) { if (PHP_TYPES[i].equals(str)) { castFlag = true; + if (PHP_TYPES[i].equals("array")) { + arrayFlag = true; + } break; } } - if (castFlag) { + } + + if (castFlag) { + getNextToken(); + if (arrayFlag && token == TokenNameLPAREN) { getNextToken(); - if (token != TokenNameRPAREN) { - throwSyntaxError(") expected after cast-type '" + str + "'."); + if (token == TokenNameRPAREN) { + getNextToken(); + } else { + expression(); + if (token != TokenNameRPAREN) { + throwSyntaxError(") expected after 'array('."); + } } - getNextToken(); - expression(); - break; } - } - if (!castFlag) { + if (token != TokenNameRPAREN) { + throwSyntaxError(") expected after cast-type '" + str + "'."); + } + getNextToken(); + expression(); + break; + } else { expression(); } if (token != TokenNameRPAREN) { @@ -2548,16 +1908,14 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { getNextToken(); break; case TokenNameVariable : + case TokenNamethis : ident = scanner.getCurrentIdentifierSource(); getNextToken(); if (token == TokenNameLBRACE) { getNextToken(); expression(); 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) { @@ -2565,10 +1923,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { 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(); @@ -2698,9 +2053,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { // rowCount, // PHPParser.INFO); setMarker( - "Avoid using keyword '" - + new String(ident) - + "' as variable name.", + "Avoid using keyword '" + new String(ident) + "' as variable name.", scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition(), INFO); @@ -2732,10 +2085,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { break; default : throwSyntaxError("Syntax error after '->' token."); - } while ( - token == TokenNameLBRACKET - || token == TokenNameLPAREN - || token == TokenNameLBRACE) { + } while (token == TokenNameLBRACKET || token == TokenNameLPAREN || token == TokenNameLBRACE) { if (token == TokenNameLBRACKET) { getNextToken(); expressionList(); @@ -2743,16 +2093,14 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { throwSyntaxError("] expected after '->'."); } getNextToken(); - } - if (token == TokenNameLPAREN) { + } else if (token == TokenNameLPAREN) { getNextToken(); expressionList(); if (token != TokenNameRPAREN) { throwSyntaxError(") expected after '->'."); } getNextToken(); - } - if (token == TokenNameLBRACE) { + } else if (token == TokenNameLBRACE) { getNextToken(); expression(); if (token != TokenNameRBRACE) { @@ -2789,7 +2137,14 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { // '@' '&' '*' '+' '-' '~' '!' case TokenNameAT : getNextToken(); - castExpression(); + if (token == TokenNameinclude + || token == TokenNameinclude_once + || token == TokenNamerequire + || token == TokenNamerequire_once) { + statement(TokenNameAT); + } else { + postfixExpression(); // castExpression(); + } break; case TokenNameAND : getNextToken(); @@ -2832,27 +2187,6 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { unaryExpression(); } - // private void typeName() throws CoreException { - // //'string' 'unset' 'array' 'object' - // //'bool' 'boolean' - // //'real' 'double' 'float' - // //'int' 'integer' - // String identifier = ""; - // if (token == TokenNameIdentifier) { - // char[] ident = scanner.getCurrentIdentifierSource(); - // identifier = new String(ident); - // String str = identifier.toLowerCase(); - // getNextToken(); - // for (int i = 0; i < PHP_TYPES.length; i++) { - // if (PHP_TYPES[i].equals(str)) { - // return; - // } - // } - // } - // throwSyntaxError( - // "Expected type cast '( )'; Got '" + identifier + "'."); - // } - private void assignExpression() throws CoreException { castExpression(); if (token == TokenNameEQUAL) { // = @@ -2903,9 +2237,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { private void multiplicativeExpression() throws CoreException { do { assignExpression(); - if (token != TokenNameMULTIPLY - && token != TokenNameDIVIDE - && token != TokenNameREMAINDER) { + if (token != TokenNameMULTIPLY && token != TokenNameDIVIDE && token != TokenNameREMAINDER) { return; } getNextToken(); @@ -2945,10 +2277,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { private void relationalExpression() throws CoreException { 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(); @@ -2958,8 +2287,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { private void identicalExpression() throws CoreException { do { relationalExpression(); - if (token != TokenNameEQUAL_EQUAL_EQUAL - && token != TokenNameNOT_EQUAL_EQUAL) { + if (token != TokenNameEQUAL_EQUAL_EQUAL && token != TokenNameNOT_EQUAL_EQUAL) { return; } getNextToken(); @@ -3173,10 +2501,7 @@ public class Parser extends PHPParserSuperclass implements ITerminalSymbols { 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();