import net.sourceforge.phpdt.internal.compiler.parser.PHPSegmentWithChildren;
import net.sourceforge.phpdt.internal.compiler.parser.PHPFunctionDeclaration;
import net.sourceforge.phpdt.internal.compiler.parser.PHPClassDeclaration;
+import net.sourceforge.phpdt.internal.compiler.parser.PHPVarDeclaration;
+import net.sourceforge.phpdt.internal.compiler.parser.PHPReqIncDeclaration;
/**
* A new php parser.
private static final String PARSE_ERROR_STRING = "Parse error"; //$NON-NLS-1$
private static final String PARSE_WARNING_STRING = "Warning"; //$NON-NLS-1$
- public static final int ERROR = 2;
- public static final int WARNING = 1;
- public static final int INFO = 0;
PHPOutlineInfo outlineInfo;
private static int errorLevel = ERROR;
private static String errorMessage;
try {
parse();
} catch (ParseException e) {
- if (errorMessage == null) {
- PHPeclipsePlugin.log(e);
- } else {
- setMarker(errorMessage, e.currentToken.beginLine, errorLevel);
- errorMessage = null;
- }
+ processParseException(e);
}
return outlineInfo;
}
-
/**
- * Create marker for the parse error
+ * This method will process the parse exception.
+ * If the error message is null, the parse exception wasn't catched and a trace is written in the log
+ * @param e the ParseException
*/
- private static void setMarker(String message, int lineNumber, int errorLevel) {
- try {
- setMarker(fileToParse, message, lineNumber, errorLevel);
- } catch (CoreException e) {
+ private static void processParseException(final ParseException e) {
+ if (errorMessage == null) {
PHPeclipsePlugin.log(e);
+ errorMessage = "this exception wasn't handled by the parser please tell us how to reproduce it";
}
+ setMarker(e);
+ errorMessage = null;
}
- public static void setMarker(IFile file, String message, int lineNumber, 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.setLineNumber(attributes, lineNumber);
- MarkerUtilities.createMarker(file, attributes, IMarker.PROBLEM);
+ /**
+ * Create marker for the parse error
+ */
+ private static void setMarker(ParseException e) {
+ try {
+ setMarker(fileToParse, errorMessage, jj_input_stream.tokenBegin,jj_input_stream.tokenBegin+e.currentToken.image.length(), errorLevel);
+ } catch (CoreException e2) {
+ PHPeclipsePlugin.log(e2);
}
}
try {
parse();
} catch (ParseException e) {
- if (errorMessage == null) {
- PHPeclipsePlugin.log(e);
- } else {
- setMarker(errorMessage, e.currentToken.beginLine, errorLevel);
- errorMessage = null;
- }
+ processParseException(e);
}
}
void ClassBody() :
{}
{
- <LBRACE> ( ClassBodyDeclaration() )* <RBRACE>
+ try {
+ <LBRACE>
+ } catch (ParseException e) {
+ errorMessage = "'{' expected";
+ errorLevel = ERROR;
+ throw e;
+ }
+ ( ClassBodyDeclaration() )*
+ try {
+ <RBRACE>
+ } catch (ParseException e) {
+ errorMessage = "'var', 'function' or '}' expected";
+ errorLevel = ERROR;
+ throw e;
+ }
}
void ClassBodyDeclaration() :
}
void FieldDeclaration() :
-{}
{
- <VAR> VariableDeclarator() ( <COMMA> VariableDeclarator() )* <SEMICOLON>
+ PHPVarDeclaration variableDeclaration;
+}
+{
+ <VAR> variableDeclaration = VariableDeclarator()
+ {currentSegment.add(variableDeclaration);}
+ ( <COMMA>
+ variableDeclaration = VariableDeclarator()
+ {currentSegment.add(variableDeclaration);}
+ )*
+ try {
+ <SEMICOLON>
+ } catch (ParseException e) {
+ errorMessage = "';' expected after variable declaration";
+ errorLevel = ERROR;
+ throw e;
+ }
}
-String VariableDeclarator() :
+PHPVarDeclaration VariableDeclarator() :
{
- String expr;
- StringBuffer buff = new StringBuffer();
+ String varName;
+ String varValue = null;
+ int pos;
}
{
- expr = VariableDeclaratorId()
- {buff.append(expr);}
- [ <ASSIGN> expr = VariableInitializer()
- {buff.append("=").append(expr);}
+ varName = VariableDeclaratorId()
+ {pos = jj_input_stream.tokenBegin;}
+ [
+ <ASSIGN>
+ try {
+ varValue = VariableInitializer()
+ } catch (ParseException e) {
+ errorMessage = "Literal expression expected in variable initializer";
+ errorLevel = ERROR;
+ throw e;
+ }
]
- {return buff.toString();}
+ {
+ if (varValue == null) {
+ return new PHPVarDeclaration(currentSegment,varName,pos);
+ }
+ return new PHPVarDeclaration(currentSegment,varName,pos,varValue);
+ }
}
String VariableDeclaratorId() :
StringBuffer buff = new StringBuffer();
}
{
- expr = Variable()
- {buff.append(expr);}
- ( LOOKAHEAD(2) expr = VariableSuffix()
- {buff.append(expr);}
- )*
- {return buff.toString();}
+ try {
+ expr = Variable()
+ {buff.append(expr);}
+ ( LOOKAHEAD(2) expr = VariableSuffix()
+ {buff.append(expr);}
+ )*
+ {return buff.toString();}
+ } catch (ParseException e) {
+ errorMessage = "'$' expected for variable identifier";
+ errorLevel = ERROR;
+ throw e;
+ }
}
String Variable():
return token.image;
}
return token + "{" + expr + "}";
- }|
+ }
+|
<DOLLAR> expr = VariableName()
{return "$" + expr;}
+|
+ token = <DOLLAR_ID> [expr = VariableName()]
+ {
+ if (expr == null) {
+ return token.image;
+ }
+ return token.image + expr;
+ }
}
String VariableInitializer() :
String expr;
}
{
- expr = Expression()
+ expr = Literal()
{return expr;}
}
currentSegment.add(functionDeclaration);
currentSegment = functionDeclaration;
}
- ( Block() | <SEMICOLON> )
+ Block()
{
currentSegment = (PHPSegmentWithChildren) currentSegment.getParent();
}
int pos = jj_input_stream.bufpos;
}
{
- [ <BIT_AND> {methodDeclaration.append("&");}]
- identifier = <IDENTIFIER> formalParameters = FormalParameters()
+ [ <BIT_AND> {methodDeclaration.append("&");} ]
+ identifier = <IDENTIFIER>
+ {methodDeclaration.append(identifier);}
+ formalParameters = FormalParameters()
{
- methodDeclaration.append(identifier).append(formalParameters);
+ methodDeclaration.append(formalParameters);
return new PHPFunctionDeclaration(currentSegment,methodDeclaration.toString(),pos);
}
}
String FormalParameters() :
{
String expr;
- StringBuffer buff = new StringBuffer("(");
+ final StringBuffer buff = new StringBuffer("(");
}
{
- <LPAREN> [ expr = FormalParameter() {buff.append(expr);}
- ( <COMMA> expr = FormalParameter()
- {buff.append(",").append(expr);}
- )* ] <RPAREN>
+ try {
+ <LPAREN>
+ } catch (ParseException e) {
+ errorMessage = "Formal parameter expected after function identifier";
+ errorLevel = ERROR;
+ jj_consume_token(token.kind);
+ }
+ [ expr = FormalParameter()
+ {buff.append(expr);}
+ (
+ <COMMA> expr = FormalParameter()
+ {buff.append(",").append(expr);}
+ )*
+ ]
+ try {
+ <RPAREN>
+ } catch (ParseException e) {
+ errorMessage = "')' expected";
+ errorLevel = ERROR;
+ throw e;
+ }
{
buff.append(")");
return buff.toString();
String FormalParameter() :
{
- String expr;
+ PHPVarDeclaration variableDeclaration;
StringBuffer buff = new StringBuffer();
}
{
- [<BIT_AND> {buff.append("&");}] expr = VariableDeclarator()
+ [<BIT_AND> {buff.append("&");}] variableDeclaration = VariableDeclarator()
{
- buff.append(expr);
+ buff.append(variableDeclaration.toString());
return buff.toString();
}
}
String MultiplicativeExpression() :
{
- String expr;
+ String expr, expr2;
Token operator;
- String expr2;
- StringBuffer buff = new StringBuffer();}
+ final StringBuffer buff = new StringBuffer();}
{
expr = UnaryExpression()
{buff.append(expr);}
String UnaryExpression() :
{
String expr;
- StringBuffer buff = new StringBuffer();
+ final StringBuffer buff = new StringBuffer();
}
{
<AT> expr = UnaryExpression()
{return expr;}
|
expr = UnaryExpressionNotPlusMinus()
- {return buff.toString();}
+ {return expr;}
}
String PreIncrementExpression() :
{
Token identifier;
String expr;
- StringBuffer buff = new StringBuffer();
+ final StringBuffer buff = new StringBuffer();
}
{
LOOKAHEAD(2)
)*
{return buff.toString();}
|
- expr = PrimaryPrefix()
- {buff.append(expr);}
- (
- expr = PrimarySuffix()
- {buff.append(expr);}
- )*
+ expr = PrimaryPrefix() {buff.append(expr);}
+ ( expr = PrimarySuffix() {buff.append(expr);} )*
{return buff.toString();}
|
<ARRAY> expr = ArrayInitializer()
if (token == null) {
return "new " + expr;
}
- return "new " + expr;
+ return "new &" + expr;
}
|
expr = VariableDeclaratorId()
|
EchoStatement()
|
- IncludeStatement()
+ [<AT>] IncludeStatement()
|
StaticStatement()
|
}
void IncludeStatement() :
-{}
{
- <REQUIRE> Expression() (<SEMICOLON> | "?>")
+ Token token;
+ String expr;
+ int pos;
+}
+{
+ token = <REQUIRE>
+ {pos = token.beginLine;}
+ expr = Expression()
+ {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require",pos,expr));}
+ (<SEMICOLON> | "?>")
|
- <REQUIRE_ONCE> Expression() (<SEMICOLON> | "?>")
+ token = <REQUIRE_ONCE>
+ {pos = token.beginLine;}
+ expr = Expression()
+ {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require_once",pos,expr));}
+ (<SEMICOLON> | "?>")
|
- <INCLUDE> Expression() (<SEMICOLON> | "?>")
+ token = <INCLUDE>
+ {pos = token.beginLine;}
+ expr = Expression()
+ {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include",pos,expr));}
+ (<SEMICOLON> | "?>")
|
- <INCLUDE_ONCE> Expression() (<SEMICOLON> | "?>")
+ token = <INCLUDE_ONCE>
+ {pos = token.beginLine;}
+ expr = Expression()
+ {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include_once",pos,expr));}
+ (<SEMICOLON> | "?>")
}
String PrintExpression() :
void Block() :
{}
{
- <LBRACE> ( BlockStatement() )* <RBRACE>
+ try {
+ <LBRACE>
+ } catch (ParseException e) {
+ errorMessage = "'{' expected";
+ errorLevel = ERROR;
+ throw e;
+ }
+ ( BlockStatement() )*
+ <RBRACE>
}
void BlockStatement() :