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 61fd6d7..8a5839f 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 @@ -10,36 +10,23 @@ Contributors: **********************************************************************/ package net.sourceforge.phpdt.internal.compiler.parser; -import java.text.MessageFormat; import java.util.ArrayList; -import java.util.HashMap; import java.util.Hashtable; import net.sourceforge.phpdt.core.compiler.*; -import net.sourceforge.phpdt.internal.compiler.parser.*; import net.sourceforge.phpeclipse.PHPeclipsePlugin; -import net.sourceforge.phpeclipse.actions.PHPStartApacheAction; import net.sourceforge.phpeclipse.phpeditor.PHPString; -import net.sourceforge.phpeclipse.phpeditor.php.PHPKeywords; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.ui.texteditor.MarkerUtilities; +import test.PHPParserSuperclass; -public class Parser extends PHPKeywords implements ITerminalSymbols { - // strings for external parser call - private static final String PARSE_ERROR_STRING = "Parse error"; //$NON-NLS-1$ - private static final String PARSE_WARNING_STRING = "Warning"; //$NON-NLS-1$ +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; - - public static final boolean DEBUG = false; - //scanner token + //scanner token public Scanner scanner; private IFile fileToParse; @@ -48,11 +35,11 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { private int currentPHPString; private boolean phpEnd; - private static HashMap keywordMap = null; + // private static HashMap keywordMap = null; private String str; // current character -// char ch; + // char ch; // current token int token; @@ -72,7 +59,7 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { private String stringValue; /** Contains the current expression. */ - // private StringBuffer expression; + // private StringBuffer expression; private boolean phpMode; @@ -151,28 +138,41 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { // final static int TokenNameNOT_EQUAL_EQUAL = 158; // final static int TokenNameOR = 159; // final static int TokenNameAT = 153; // @ + + public Parser() { + } + + public void setFileToParse(IFile fileToParse) { + this.currentPHPString = 0; + this.fileToParse = fileToParse; + this.phpList = null; + this.str = ""; + this.token = TokenNameEOF; + this.phpEnd = false; + this.initializeScanner(); + } /** - * Class Constructor. + * ClassDeclaration Constructor. * *@param s *@param sess Description of Parameter *@see */ public Parser(IFile fileToParse) { - if (keywordMap == null) { - keywordMap = new HashMap(); - for (int i = 0; i < PHP_KEYWORS.length; i++) { - keywordMap.put(PHP_KEYWORS[i], new Integer(PHP_KEYWORD_TOKEN[i])); - } - } + // if (keywordMap == null) { + // keywordMap = new HashMap(); + // for (int i = 0; i < PHP_KEYWORS.length; i++) { + // keywordMap.put(PHP_KEYWORS[i], new Integer(PHP_KEYWORD_TOKEN[i])); + // } + // } this.currentPHPString = 0; this.fileToParse = fileToParse; this.phpList = null; this.str = ""; this.token = TokenNameEOF; -// this.chIndx = 0; -// this.rowCount = 1; -// this.columnCount = 0; + // this.chIndx = 0; + // this.rowCount = 1; + // this.columnCount = 0; this.phpEnd = false; // getNextToken(); @@ -185,45 +185,10 @@ public class Parser extends PHPKeywords 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 @@ -232,28 +197,24 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { */ private void throwSyntaxError(String error) { -// if (str.length() < chIndx) { -// chIndx--; -// } -// // read until end-of-line -// int eol = chIndx; -// while (str.length() > eol) { -// ch = str.charAt(eol++); -// if (ch == '\n') { -// eol--; -// break; -// } -// } -// throw new SyntaxError( -// rowCount, -// chIndx - columnCount + 1, -// str.substring(columnCount, eol), -// error); - throw new SyntaxError( - 1, - 1, - "", - error); + // if (str.length() < chIndx) { + // chIndx--; + // } + // // read until end-of-line + // int eol = chIndx; + // while (str.length() > eol) { + // ch = str.charAt(eol++); + // if (ch == '\n') { + // eol--; + // break; + // } + // } + // throw new SyntaxError( + // rowCount, + // chIndx - columnCount + 1, + // str.substring(columnCount, eol), + // error); + throw new SyntaxError(1, 1, "", error); } /** @@ -271,18 +232,18 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { * *@see */ -// private void getChar() { -// if (str.length() > chIndx) { -// ch = str.charAt(chIndx++); -// -// return; -// } -// -// chIndx = str.length() + 1; -// ch = ' '; -// // token = TokenNameEOF; -// phpEnd = true; -// } + // private void getChar() { + // if (str.length() > chIndx) { + // ch = str.charAt(chIndx++); + // + // return; + // } + // + // chIndx = str.length() + 1; + // ch = ' '; + // // token = TokenNameEOF; + // phpEnd = true; + // } /** * gets the next token from input @@ -290,12 +251,11 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { private void getNextToken() throws CoreException { try { token = scanner.getNextToken(); - if (DEBUG) { + 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) { @@ -921,137 +881,137 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { * 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(); -// char dFlag = ' '; -// int numFormat = 10; -// -// // save first digit -// char firstCh = ch; -// inum.append(ch); -// -// getChar(); -// // determine number conversions: -// if (firstCh == '0') { -// switch (ch) { -// case 'b' : -// numFormat = 2; -// getChar(); -// break; -// case 'B' : -// numFormat = 2; -// getChar(); -// break; -// case 'o' : -// numFormat = 8; -// getChar(); -// break; -// case 'O' : -// numFormat = 8; -// getChar(); -// break; -// case 'x' : -// numFormat = 16; -// getChar(); -// break; -// case 'X' : -// numFormat = 16; -// getChar(); -// break; -// } -// } -// -// if (numFormat == 16) { -// while ((ch >= '0' && ch <= '9') -// || (ch >= 'a' && ch <= 'f') -// || (ch >= 'A' && ch <= 'F')) { -// inum.append(ch); -// getChar(); -// } -// } else { -// while ((ch >= '0' && ch <= '9') -// || (ch == '.') -// || (ch == 'E') -// || (ch == 'e')) { -// if ((ch == '.') || (ch == 'E') || (ch == 'e')) { -// if (ch == '.' && dFlag != ' ') { -// break; -// } -// if ((dFlag == 'E') || (dFlag == 'e')) { -// break; -// } -// dFlag = ch; -// inum.append(ch); -// getChar(); -// if ((ch == '-') || (ch == '+')) { -// inum.append(ch); -// getChar(); -// } -// } else { -// inum.append(ch); -// getChar(); -// } -// } -// } -// chIndx--; -// -// try { -// if (dFlag != ' ') { -// doubleNumber = new Double(inum.toString()); -// token = TokenNameDoubleLiteral; -// return; -// } else { -// longNumber = Long.valueOf(inum.toString(), numFormat); -// token = TokenNameIntegerLiteral; -// return; -// } -// -// } catch (Throwable e) { -// throwSyntaxError("Number format error: " + inum.toString()); -// } -// } -// -// /** -// * Get a String. -// * @param openChar the opening char ('\'', '"', '`') -// * @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( -// final char openChar, -// final int typeString, -// final String errorMsg) { -// StringBuffer sBuffer = new StringBuffer(); -// boolean openString = true; -// int startRow = rowCount; -// while (str.length() > chIndx) { -// ch = str.charAt(chIndx++); -// if (ch == '\\') { -// sBuffer.append(ch); -// if (str.length() > chIndx) { -// ch = str.charAt(chIndx++); -// sBuffer.append(ch); -// } -// } else if (ch == openChar) { -// openString = false; -// break; -// } else if (ch == '\n') { -// rowCount++; -// columnCount = chIndx; -// } else { -// sBuffer.append(ch); -// } -// } -// if (openString) { -// if (typeString == TokenNameStringConstant) { -// throwSyntaxError(errorMsg, startRow); -// } else { -// throwSyntaxError(errorMsg); -// } -// } -// token = typeString; -// stringValue = sBuffer.toString(); -// } + // private void getNumber() { + // StringBuffer inum = new StringBuffer(); + // char dFlag = ' '; + // int numFormat = 10; + // + // // save first digit + // char firstCh = ch; + // inum.append(ch); + // + // getChar(); + // // determine number conversions: + // if (firstCh == '0') { + // switch (ch) { + // case 'b' : + // numFormat = 2; + // getChar(); + // break; + // case 'B' : + // numFormat = 2; + // getChar(); + // break; + // case 'o' : + // numFormat = 8; + // getChar(); + // break; + // case 'O' : + // numFormat = 8; + // getChar(); + // break; + // case 'x' : + // numFormat = 16; + // getChar(); + // break; + // case 'X' : + // numFormat = 16; + // getChar(); + // break; + // } + // } + // + // if (numFormat == 16) { + // while ((ch >= '0' && ch <= '9') + // || (ch >= 'a' && ch <= 'f') + // || (ch >= 'A' && ch <= 'F')) { + // inum.append(ch); + // getChar(); + // } + // } else { + // while ((ch >= '0' && ch <= '9') + // || (ch == '.') + // || (ch == 'E') + // || (ch == 'e')) { + // if ((ch == '.') || (ch == 'E') || (ch == 'e')) { + // if (ch == '.' && dFlag != ' ') { + // break; + // } + // if ((dFlag == 'E') || (dFlag == 'e')) { + // break; + // } + // dFlag = ch; + // inum.append(ch); + // getChar(); + // if ((ch == '-') || (ch == '+')) { + // inum.append(ch); + // getChar(); + // } + // } else { + // inum.append(ch); + // getChar(); + // } + // } + // } + // chIndx--; + // + // try { + // if (dFlag != ' ') { + // doubleNumber = new Double(inum.toString()); + // token = TokenNameDoubleLiteral; + // return; + // } else { + // longNumber = Long.valueOf(inum.toString(), numFormat); + // token = TokenNameIntegerLiteral; + // return; + // } + // + // } catch (Throwable e) { + // throwSyntaxError("Number format error: " + inum.toString()); + // } + // } + // + // /** + // * Get a String. + // * @param openChar the opening char ('\'', '"', '`') + // * @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( + // final char openChar, + // final int typeString, + // final String errorMsg) { + // StringBuffer sBuffer = new StringBuffer(); + // boolean openString = true; + // int startRow = rowCount; + // while (str.length() > chIndx) { + // ch = str.charAt(chIndx++); + // if (ch == '\\') { + // sBuffer.append(ch); + // if (str.length() > chIndx) { + // ch = str.charAt(chIndx++); + // sBuffer.append(ch); + // } + // } else if (ch == openChar) { + // openString = false; + // break; + // } else if (ch == '\n') { + // rowCount++; + // columnCount = chIndx; + // } else { + // sBuffer.append(ch); + // } + // } + // if (openString) { + // if (typeString == TokenNameStringConstant) { + // throwSyntaxError(errorMsg, startRow); + // } else { + // throwSyntaxError(errorMsg); + // } + // } + // token = typeString; + // stringValue = sBuffer.toString(); + // } // public void htmlParserTester(String input) { // int lineNumber = 1; @@ -1271,9 +1231,9 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { } } this.token = TokenNameEOF; -// this.chIndx = 0; -// this.rowCount = rowCount; -// this.columnCount = 0; + // this.chIndx = 0; + // this.rowCount = rowCount; + // this.columnCount = 0; this.phpEnd = false; this.phpMode = true; scanner.setSource(s.toCharArray()); @@ -1284,7 +1244,10 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { if (token != TokenNameEOF && token != TokenNameERROR) { statementList(); } - if (token != TokenNameEOF && token != TokenNameERROR) { + if (token != TokenNameEOF) { + if (token == TokenNameERROR) { + throwSyntaxError("Scanner error (Found unknown token: " + scanner.toStringAction(token) + ")"); + } if (token == TokenNameRPAREN) { throwSyntaxError("Too many closing ')'; end-of-file not reached."); } @@ -1313,11 +1276,7 @@ public class Parser extends PHPKeywords 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' @@ -1343,9 +1302,9 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { public void parse(String s) throws CoreException { this.str = s; this.token = TokenNameEOF; -// this.chIndx = 0; -// this.rowCount = 1; -// this.columnCount = 0; + // this.chIndx = 0; + // this.rowCount = 1; + // this.columnCount = 0; this.phpEnd = false; this.phpMode = false; /* scanner initialization */ @@ -1357,7 +1316,10 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { if (token != TokenNameEOF && token != TokenNameERROR) { statementList(); } - if (token != TokenNameEOF && token != TokenNameERROR) { + if (token != TokenNameEOF) { + if (token == TokenNameERROR) { + throwSyntaxError("Scanner error (Found unknown token: " + scanner.toStringAction(token) + ")"); + } if (token == TokenNameRPAREN) { throwSyntaxError("Too many closing ')'; end-of-file not reached."); } @@ -1383,11 +1345,7 @@ public class Parser extends PHPKeywords 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' @@ -1403,11 +1361,7 @@ public class Parser extends PHPKeywords 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; } } @@ -1422,9 +1376,9 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { this.str = s; this.token = TokenNameEOF; -// this.chIndx = 0; -// this.rowCount = 1; -// this.columnCount = 0; + // this.chIndx = 0; + // this.rowCount = 1; + // this.columnCount = 0; this.phpEnd = false; this.phpMode = false; scanner.setSource(s.toCharArray()); @@ -1438,15 +1392,12 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { return outlineInfo; } - private void parseDeclarations( - PHPOutlineInfo outlineInfo, - PHPSegmentWithChildren current, - boolean goBack) { + 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) { @@ -1456,14 +1407,14 @@ public class Parser extends PHPKeywords 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) { - + getNextToken(); ident = scanner.getCurrentTokenSource(); if (token > TokenNameKEYWORD) { @@ -1483,10 +1434,7 @@ public class Parser extends PHPKeywords 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; @@ -1527,8 +1475,7 @@ public class Parser extends PHPKeywords 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), @@ -1540,8 +1487,7 @@ public class Parser extends PHPKeywords 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), @@ -1552,15 +1498,13 @@ public class Parser extends PHPKeywords 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) { @@ -1574,12 +1518,12 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { || token == TokenNamerequire_once || token == TokenNameinclude || token == TokenNameinclude_once) { - ident = scanner.getCurrentTokenSource(); - + ident = scanner.getCurrentTokenSource(); + getNextToken(); int startPosition = scanner.getCurrentTokenStartPosition(); expression(); - char[] expr = scanner.getCurrentTokenSource(startPosition); + char[] expr = scanner.getCurrentTokenSource(startPosition); outlineInfo.addVariable(new String(ident)); current.add(new PHPReqIncDeclaration(current, new String(ident), // chIndx - ident.length, @@ -1593,11 +1537,7 @@ public class Parser extends PHPKeywords 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) { } } @@ -1819,10 +1759,7 @@ public class Parser extends PHPKeywords 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(); @@ -1977,10 +1914,7 @@ public class Parser extends PHPKeywords 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(); } @@ -1997,11 +1931,14 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { if (token == TokenNameIdentifier) { getNextToken(); } else { - throwSyntaxError("Class name expected after keyword 'extends'."); + throwSyntaxError("ClassDeclaration name expected after keyword 'extends'."); } } } 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'."); } } @@ -2092,6 +2029,11 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { } else { getNextToken(); } + } else { + if (token > TokenNameKEYWORD) { + throwSyntaxError("Don't use keyword for function declaration [" + token + "]."); + } + throwSyntaxError("Function name expected after keyword 'function'."); } } // @@ -2139,8 +2081,7 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { constant(); if (token == TokenNameCOLON) { getNextToken(); - if (token == TokenNamecase - || token == TokenNamedefault) { // empty case statement ? + if (token == TokenNamecase || token == TokenNamedefault) { // empty case statement ? continue; } statementList(); @@ -2152,9 +2093,7 @@ public class Parser extends PHPKeywords 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); @@ -2164,10 +2103,7 @@ public class Parser extends PHPKeywords 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(); @@ -2446,14 +2382,14 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { private void expression() throws CoreException { //todo: find a better way to get the expression -// expression = new StringBuffer(); -// for (int i = chIndx; i < str.length(); i++) { -// if (str.charAt(i) == ';') { -// break; -// } -// expression.append(str.charAt(i)); -// } - + // expression = new StringBuffer(); + // for (int i = chIndx; i < str.length(); i++) { + // if (str.charAt(i) == ';') { + // break; + // } + // expression.append(str.charAt(i)); + // } + // if (token == TokenNameSTRING_CONSTANT || token == TokenNameINTERPOLATED_STRING) { // getNextToken(); // } else { @@ -2542,10 +2478,7 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { 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) { @@ -2553,10 +2486,7 @@ public class Parser extends PHPKeywords 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(); @@ -2686,9 +2616,7 @@ public class Parser extends PHPKeywords 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); @@ -2720,10 +2648,7 @@ public class Parser extends PHPKeywords 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(); @@ -2820,26 +2745,26 @@ public class Parser extends PHPKeywords 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 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(); @@ -2891,9 +2816,7 @@ public class Parser extends PHPKeywords 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(); @@ -2933,10 +2856,7 @@ public class Parser extends PHPKeywords 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(); @@ -2946,8 +2866,7 @@ public class Parser extends PHPKeywords 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(); @@ -3161,10 +3080,7 @@ public class Parser extends PHPKeywords 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(); @@ -3190,97 +3106,4 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { } } - /** - * Call the php parse command ( php -l -f <filename> ) - * and create markers according to the external parser output - */ - public static void phpExternalParse(IFile file) { - //IFile file = (IFile) resource; - IPath path = file.getFullPath(); - IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore(); - String filename = file.getLocation().toString(); - - String[] arguments = { filename }; - MessageFormat form = - new MessageFormat(store.getString(PHPeclipsePlugin.EXTERNAL_PARSER_PREF)); - String command = form.format(arguments); - - String parserResult = - PHPStartApacheAction.getParserOutput(command, "External parser: "); - - try { - // parse the buffer to find the errors and warnings - createMarkers(parserResult, file); - } catch (CoreException e) { - } - } - - /** - * Create markers according to the external parser output - */ - private static void createMarkers(String output, IFile file) - throws CoreException { - // delete all markers - file.deleteMarkers(IMarker.PROBLEM, false, 0); - - int indx = 0; - int brIndx = 0; - boolean flag = true; - while ((brIndx = output.indexOf("
", indx)) != -1) { - // newer php error output (tested with 4.2.3) - scanLine(output, file, indx, brIndx); - indx = brIndx + 6; - flag = false; - } - if (flag) { - while ((brIndx = output.indexOf("
", indx)) != -1) { - // older php error output (tested with 4.2.3) - scanLine(output, file, indx, brIndx); - indx = brIndx + 4; - } - } - } - - private static void scanLine(String output, IFile file, int indx, int brIndx) - throws CoreException { - String current; - String outLineNumberString; - StringBuffer lineNumberBuffer = new StringBuffer(10); - char ch; - current = output.substring(indx, brIndx); - - if (current.indexOf(PARSE_WARNING_STRING) != -1 - || current.indexOf(PARSE_ERROR_STRING) != -1) { - int onLine = current.indexOf("on line "); - if (onLine != -1) { - lineNumberBuffer.delete(0, lineNumberBuffer.length()); - for (int i = onLine; i < current.length(); i++) { - ch = current.charAt(i); - if ('0' <= ch && '9' >= ch) { - lineNumberBuffer.append(ch); - } - } - - int lineNumber = Integer.parseInt(lineNumberBuffer.toString()); - - Hashtable attributes = new Hashtable(); - - current = current.replaceAll("\n", ""); - current = current.replaceAll("", ""); - current = current.replaceAll("", ""); - MarkerUtilities.setMessage(attributes, current); - - if (current.indexOf(PARSE_ERROR_STRING) != -1) - attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR)); - else if (current.indexOf(PARSE_WARNING_STRING) != -1) - attributes.put( - IMarker.SEVERITY, - new Integer(IMarker.SEVERITY_WARNING)); - else - attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_INFO)); - MarkerUtilities.setLineNumber(attributes, lineNumber); - MarkerUtilities.createMarker(file, attributes, IMarker.PROBLEM); - } - } - } } \ No newline at end of file