import net.sourceforge.phpdt.core.compiler.*;
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;
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;
-
- //scanner token
+ //scanner token
public Scanner scanner;
private IFile fileToParse;
this.initializeScanner();
}
/**
- * Class Constructor.
+ * ClassDeclaration Constructor.
*
*@param s
*@param sess Description of Parameter
/**
* 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
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) {
}
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.");
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'
}
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.");
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'
}
} 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;
}
}
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;
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) {
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;
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),
}
} 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),
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) {
} 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) {
}
}
foreachStatement();
return;
- } else if (
- token == TokenNamecontinue
- || token == TokenNamebreak
- || token == TokenNamereturn) {
+ } else if (token == TokenNamecontinue || token == TokenNamebreak || token == TokenNamereturn) {
getNextToken();
if (token != TokenNameSEMICOLON) {
expression();
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();
}
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'.");
}
}
} else {
getNextToken();
}
+ } else {
+ if (token > TokenNameKEYWORD) {
+ throwSyntaxError("Don't use keyword for function declaration [" + token + "].");
+ }
+ throwSyntaxError("Function name expected after keyword 'function'.");
}
}
//
constant();
if (token == TokenNameCOLON) {
getNextToken();
- if (token == TokenNamecase
- || token == TokenNamedefault) { // empty case statement ?
+ if (token == TokenNamecase || token == TokenNamedefault) { // empty case statement ?
continue;
}
statementList();
// 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);
}
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();
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) {
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();
// 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);
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();
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 '( <type-name> )'; 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 '( <type-name> )'; Got '" + identifier + "'.");
+ // }
private void assignExpression() throws CoreException {
castExpression();
private void multiplicativeExpression() throws CoreException {
do {
assignExpression();
- if (token != TokenNameMULTIPLY
- && token != TokenNameDIVIDE
- && token != TokenNameREMAINDER) {
+ if (token != TokenNameMULTIPLY && token != TokenNameDIVIDE && token != TokenNameREMAINDER) {
return;
}
getNextToken();
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();
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();
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();