X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/test/PHPParser.jj b/net.sourceforge.phpeclipse/src/test/PHPParser.jj index a6bce7c..46fb115 100644 --- a/net.sourceforge.phpeclipse/src/test/PHPParser.jj +++ b/net.sourceforge.phpeclipse/src/test/PHPParser.jj @@ -38,6 +38,8 @@ import net.sourceforge.phpdt.internal.compiler.parser.PHPOutlineInfo; 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. @@ -55,9 +57,6 @@ public class PHPParser extends PHPParserSuperclass { 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; @@ -104,45 +103,38 @@ public class PHPParser extends PHPParserSuperclass { 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, + "Line " + e.currentToken.beginLine); + } catch (CoreException e2) { + PHPeclipsePlugin.log(e2); } } @@ -214,12 +206,7 @@ public class PHPParser extends PHPParserSuperclass { try { parse(); } catch (ParseException e) { - if (errorMessage == null) { - PHPeclipsePlugin.log(e); - } else { - setMarker(errorMessage, e.currentToken.beginLine, errorLevel); - errorMessage = null; - } + processParseException(e); } } @@ -290,10 +277,14 @@ PARSER_END(PHPParser) "/*" : IN_MULTI_LINE_COMMENT } - -SPECIAL_TOKEN : + SPECIAL_TOKEN : { - " > : PHPPARSING + : PHPPARSING +} + + TOKEN : +{ + " > : DEFAULT } @@ -365,6 +356,8 @@ MORE : | < TRUE: "true" > | < WHILE: "while" > | < ENDWHILE : "endwhile" > +| +| } /* TYPES */ @@ -416,20 +409,30 @@ MORE : < STRING_LITERAL: ( | | )> | < STRING_1: "\"" - ( (~["\""]) - | "\\\"" + ( + ~["\""] + | + "\\\"" )* "\"" > | < STRING_2: "'" - ( (~["'"]))* + ( + ~["'"] + | + "\\'" + )* "'" > | < STRING_3: "`" - ( (~["`"]))* + ( + ~["`"] + | + "\\`" + )* "`" > } @@ -449,7 +452,7 @@ MORE : > | < #SPECIAL: - "_" + "_" | ["\u007f"-"\u00ff"] > } @@ -474,43 +477,45 @@ MORE : { | -| < ASSIGN: "=" > -| < GT: ">" > -| < LT: "<" > -| < BANG: "!" > -| < HOOK: "?" > -| < COLON: ":" > -| < EQ: "==" > -| < LE: "<=" > -| < GE: ">=" > -| < NE: "!=" > -| < SC_OR: "||" > -| < SC_AND: "&&" > -| < INCR: "++" > -| < DECR: "--" > -| < PLUS: "+" > -| < MINUS: "-" > -| < STAR: "*" > -| < SLASH: "/" > -| < BIT_AND: "&" > -| < BIT_OR: "|" > -| < XOR: "^" > -| < REM: "%" > -| < LSHIFT: "<<" > -| < RSIGNEDSHIFT: ">>" > -| < RUNSIGNEDSHIFT: ">>>" > -| < PLUSASSIGN: "+=" > -| < MINUSASSIGN: "-=" > -| < STARASSIGN: "*=" > -| < SLASHASSIGN: "/=" > -| < ANDASSIGN: "&=" > -| < ORASSIGN: "|=" > -| < XORASSIGN: "^=" > -| < DOTASSIGN: ".=" > -| < REMASSIGN: "%=" > -| < LSHIFTASSIGN: "<<=" > -| < RSIGNEDSHIFTASSIGN: ">>=" > -| < RUNSIGNEDSHIFTASSIGN: ">>>=" > +| " > +| +| +| +| +| +| =" > +| +| +| +| +| +| +| +| +| +| +| +| +| +| >" > +| >>" > +| +| >=" > +| +| +| + } catch (ParseException e) { + errorMessage = "'var', 'function' or '}' expected"; + errorLevel = ERROR; + throw e; + } } void ClassBodyDeclaration() : @@ -580,23 +605,49 @@ void ClassBodyDeclaration() : } void FieldDeclaration() : -{} { - VariableDeclarator() ( VariableDeclarator() )* + PHPVarDeclaration variableDeclaration; +} +{ + variableDeclaration = VariableDeclarator() + {currentSegment.add(variableDeclaration);} + ( + variableDeclaration = VariableDeclarator() + {currentSegment.add(variableDeclaration);} + )* + try { + + } 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 = jj_input_stream.bufpos; } { - expr = VariableDeclaratorId() - {buff.append(expr);} - [ expr = VariableInitializer() - {buff.append("=").append(expr);} + varName = VariableDeclaratorId() + [ + + 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() : @@ -605,12 +656,18 @@ 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(): @@ -646,18 +703,40 @@ Token token; return token.image; } return token + "{" + expr + "}"; - }| + } +| expr = VariableName() {return "$" + expr;} +| + token = [expr = VariableName()] + { + if (expr == null) { + return token.image; + } + return token.image + expr; + } } String VariableInitializer() : { String expr; + Token token; } { - expr = Expression() + expr = Literal() + {return expr;} +| + (token = | token = ) + {return "-" + token.image;} +| + (token = | token = ) + {return "+" + token.image;} +| + expr = ArrayDeclarator() {return expr;} +| + token = + {return token.image;} } String ArrayVariable() : @@ -701,7 +780,7 @@ void MethodDeclaration() : currentSegment.add(functionDeclaration); currentSegment = functionDeclaration; } - ( Block() | ) + Block() { currentSegment = (PHPSegmentWithChildren) currentSegment.getParent(); } @@ -715,10 +794,12 @@ PHPFunctionDeclaration MethodDeclarator() : int pos = jj_input_stream.bufpos; } { - [ {methodDeclaration.append("&");}] - identifier = formalParameters = FormalParameters() + [ {methodDeclaration.append("&");} ] + identifier = + {methodDeclaration.append(identifier);} + formalParameters = FormalParameters() { - methodDeclaration.append(identifier).append(formalParameters); + methodDeclaration.append(formalParameters); return new PHPFunctionDeclaration(currentSegment,methodDeclaration.toString(),pos); } } @@ -726,13 +807,30 @@ PHPFunctionDeclaration MethodDeclarator() : String FormalParameters() : { String expr; - StringBuffer buff = new StringBuffer("("); + final StringBuffer buff = new StringBuffer("("); } { - [ expr = FormalParameter() {buff.append(expr);} - ( expr = FormalParameter() - {buff.append(",").append(expr);} - )* ] + try { + + } catch (ParseException e) { + errorMessage = "Formal parameter expected after function identifier"; + errorLevel = ERROR; + jj_consume_token(token.kind); + } + [ expr = FormalParameter() + {buff.append(expr);} + ( + expr = FormalParameter() + {buff.append(",").append(expr);} + )* + ] + try { + + } catch (ParseException e) { + errorMessage = "')' expected"; + errorLevel = ERROR; + throw e; + } { buff.append(")"); return buff.toString(); @@ -741,13 +839,13 @@ String FormalParameters() : String FormalParameter() : { - String expr; + PHPVarDeclaration variableDeclaration; StringBuffer buff = new StringBuffer(); } { - [ {buff.append("&");}] expr = VariableDeclarator() + [ {buff.append("&");}] variableDeclaration = VariableDeclarator() { - buff.append(expr); + buff.append(variableDeclaration.toString()); return buff.toString(); } } @@ -778,6 +876,9 @@ String Type() : | {return "integer";} +| + + {return "object";} } String Expression() : @@ -793,7 +894,13 @@ String Expression() : expr = ConditionalExpression() [ assignOperator = AssignmentOperator() - expr2 = Expression() + try { + expr2 = Expression() + } catch (ParseException e) { + errorMessage = "expression expected"; + errorLevel = ERROR; + throw e; + } ] { if (expr2 == null) { @@ -805,9 +912,7 @@ String Expression() : } String AssignmentOperator() : -{ - Token assignOperator; -} +{} { {return "=";} @@ -825,8 +930,6 @@ String AssignmentOperator() : {return "<<=";} | {return ">>=";} -| -{return ">>>=";} | {return "&=";} | @@ -835,6 +938,8 @@ String AssignmentOperator() : {return "|=";} | {return ".=";} +| +{return "~=";} } String ConditionalExpression() : @@ -1005,7 +1110,12 @@ String EqualityExpression() : expr = RelationalExpression() {buff.append(expr);} ( - ( operator = | operator = ) expr2 = RelationalExpression() + ( operator = + | operator = + | operator = + | operator = + ) + expr2 = RelationalExpression() { buff.append(operator.image); buff.append(expr2); @@ -1076,10 +1186,9 @@ String AdditiveExpression() : 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);} @@ -1093,19 +1202,37 @@ String MultiplicativeExpression() : {return buff.toString();} } +/** + * An unary expression starting with @, & or nothing + */ String UnaryExpression() : { String expr; - StringBuffer buff = new StringBuffer(); + Token token; + final StringBuffer buff = new StringBuffer(); } { - expr = UnaryExpression() - {return "@" + expr;} + token = expr = UnaryExpressionNoPrefix() + { + if (token == null) { + return expr; + } + return token.image + expr; + } | - ( {buff.append("+");}| {buff.append("-");}) expr = UnaryExpression() + ( {buff.append("@");})* expr = UnaryExpressionNoPrefix() + {return buff.append(expr).toString();} +} + +String UnaryExpressionNoPrefix() : +{ + String expr; + Token token; +} +{ + ( token = | token = ) expr = UnaryExpression() { - buff.append(expr); - return buff.toString(); + return token.image + expr; } | expr = PreIncrementExpression() @@ -1115,9 +1242,10 @@ String UnaryExpression() : {return expr;} | expr = UnaryExpressionNotPlusMinus() - {return buff.toString();} + {return expr;} } + String PreIncrementExpression() : { String expr; @@ -1187,7 +1315,7 @@ String PrimaryExpression() : { Token identifier; String expr; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { LOOKAHEAD(2) @@ -1199,14 +1327,19 @@ String PrimaryExpression() : )* {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();} | + expr = ArrayDeclarator() + {return "array" + expr;} +} + +String ArrayDeclarator() : +{ + String expr; +} +{ expr = ArrayInitializer() {return "array" + expr;} } @@ -1220,11 +1353,8 @@ String PrimaryPrefix() : token = {return token.image;} | - [token = ] expr = ClassIdentifier() + expr = ClassIdentifier() { - if (token == null) { - return "new " + expr; - } return "new " + expr; } | @@ -1265,7 +1395,14 @@ String VariableSuffix() : expr = VariableName() {return "->" + expr;} | - [ expr = Expression() ] + [ expr = Expression() ] + try { + + } catch (ParseException e) { + errorMessage = "']' expected"; + errorLevel = ERROR; + throw e; + } { if(expr == null) { return "[]"; @@ -1286,14 +1423,8 @@ String Literal() : token = {return token.image;} | - try { - token = + token = {return token.image;} - } catch (TokenMgrError e) { - errorMessage = "unterminated string"; - errorLevel = ERROR; - throw generateParseException(); - } | expr = BooleanLiteral() {return expr;} @@ -1371,7 +1502,14 @@ void Statement() : {} { LOOKAHEAD(2) - Expression() ( | "?>") + Expression() + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } | LOOKAHEAD(2) LabeledStatement() @@ -1399,6 +1537,8 @@ void Statement() : | ForStatement() | + ForeachStatement() +| BreakStatement() | ContinueStatement() @@ -1407,7 +1547,7 @@ void Statement() : | EchoStatement() | - IncludeStatement() + [] IncludeStatement() | StaticStatement() | @@ -1415,15 +1555,54 @@ void Statement() : } void IncludeStatement() : -{} { - Expression() ( | "?>") + String expr; + int pos = jj_input_stream.bufpos; +} +{ + + expr = Expression() + {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require",pos,expr));} + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } | - Expression() ( | "?>") + + expr = Expression() + {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require_once",pos,expr));} + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } | - Expression() ( | "?>") + + expr = Expression() + {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include",pos,expr));} + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } | - Expression() ( | "?>") + + expr = Expression() + {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include_once",pos,expr));} + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } } String PrintExpression() : @@ -1455,13 +1634,27 @@ void EchoStatement() : void GlobalStatement() : {} { - VariableDeclaratorId() ( VariableDeclaratorId())* ( | "?>") + VariableDeclaratorId() ( VariableDeclaratorId())* + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } } void StaticStatement() : {} { - VariableDeclarator() ( VariableDeclarator())* ( | "?>") + VariableDeclarator() ( VariableDeclarator())* + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } } void LabeledStatement() : @@ -1473,7 +1666,15 @@ void LabeledStatement() : void Block() : {} { - ( BlockStatement() )* + try { + + } catch (ParseException e) { + errorMessage = "'{' expected"; + errorLevel = ERROR; + throw e; + } + ( BlockStatement() )* + } void BlockStatement() : @@ -1499,11 +1700,6 @@ void EmptyStatement() : } void StatementExpression() : -/* - * The last expansion of this production accepts more than the legal - * Java expansions for StatementExpression. This expansion does not - * use PostfixExpression for performance reasons. - */ {} { PreIncrementExpression() @@ -1582,7 +1778,14 @@ void WhileStatement() : void WhileStatement0() : {} { - (Statement())* ( | "?>") + (Statement())* + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } | Statement() } @@ -1590,7 +1793,20 @@ void WhileStatement0() : void DoStatement() : {} { - Statement() Condition("while") ( | "?>") + Statement() Condition("while") + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } +} + +void ForeachStatement() : +{} +{ + Variable() Variable() [ Expression() ] Statement() } void ForStatement() :