X-Git-Url: http://secure.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..11b48d9 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;
@@ -166,20 +159,20 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina
*@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());
@@ -1453,7 +1424,7 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina
// 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,
@@ -2008,6 +1980,10 @@ public class Parser extends PHPParserSuperclass implements PHPKeywords, ITermina
}
}
} else {
+ if (token > TokenNameKEYWORD) {
+ throwSyntaxError(
+ "Don't use keyword for class declaration [" + token + "].");
+ }
throwSyntaxError("Class 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();