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 e3bea19..e3d3672 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 @@ -14,10 +14,8 @@ import java.util.ArrayList; 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.phpeditor.PHPString; -import net.sourceforge.phpeclipse.phpeditor.php.PHPKeywords; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; @@ -26,14 +24,9 @@ import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.ui.texteditor.MarkerUtilities; import test.PHPParserSuperclass; -public class Parser extends PHPParserSuperclass implements PHPKeywords, ITerminalSymbols { +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; @@ -46,7 +39,7 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina private String str; // current character -// char ch; + // char ch; // current token int token; @@ -66,7 +59,7 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina private String stringValue; /** Contains the current expression. */ - // private StringBuffer expression; + // private StringBuffer expression; private boolean phpMode; @@ -159,27 +152,27 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina 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(); @@ -201,36 +194,6 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina 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 @@ -239,28 +202,24 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina */ 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); } /** @@ -278,18 +237,18 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina * *@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 @@ -297,7 +256,7 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina private void getNextToken() throws CoreException { try { token = scanner.getNextToken(); - if (DEBUG) { + if (Scanner.DEBUG) { int currentEndPosition = scanner.getCurrentTokenEndPosition(); int currentStartPosition = scanner.getCurrentTokenStartPosition(); @@ -928,137 +887,137 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina * 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; @@ -1278,9 +1237,9 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina } } 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()); @@ -1291,7 +1250,13 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina 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."); } @@ -1350,9 +1315,9 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina 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 */ @@ -1364,7 +1329,13 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina 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."); } @@ -1429,9 +1400,9 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina 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()); @@ -1447,13 +1418,13 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina private void parseDeclarations( PHPOutlineInfo outlineInfo, - PHPSegmentWithChildren current, + 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) { @@ -1466,11 +1437,12 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina 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) { @@ -1581,12 +1553,12 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina || 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, @@ -2004,11 +1976,15 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina 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'."); } } @@ -2099,6 +2075,12 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina } else { getNextToken(); } + } else { + if (token > TokenNameKEYWORD) { + throwSyntaxError( + "Don't use keyword for function declaration [" + token + "]."); + } + throwSyntaxError("Function name expected after keyword 'function'."); } } // @@ -2453,14 +2435,14 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina 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 { @@ -2827,26 +2809,26 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina 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();