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 7c68a46..2a86a45 100644 --- a/net.sourceforge.phpeclipse/src/test/PHPParser.jj +++ b/net.sourceforge.phpeclipse/src/test/PHPParser.jj @@ -127,7 +127,12 @@ public class PHPParser extends PHPParserSuperclass { */ private static void setMarker(ParseException e) { try { - setMarker(fileToParse, errorMessage, jj_input_stream.tokenBegin,jj_input_stream.tokenBegin+e.currentToken.image.length(), errorLevel); + 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); } @@ -197,7 +202,11 @@ public class PHPParser extends PHPParserSuperclass { } public void parse(String s) throws CoreException { - ReInit(new StringReader(s)); + StringReader stream = new StringReader(s); + if (jj_input_stream == null) { + jj_input_stream = new SimpleCharStream(stream, 1, 1); + } + ReInit(stream); try { parse(); } catch (ParseException e) { @@ -272,10 +281,14 @@ PARSER_END(PHPParser) "/*" : IN_MULTI_LINE_COMMENT } - -SPECIAL_TOKEN : + SPECIAL_TOKEN : { - " > : PHPPARSING + : PHPPARSING +} + + TOKEN : +{ + " > : DEFAULT } @@ -347,6 +360,10 @@ MORE : | < TRUE: "true" > | < WHILE: "while" > | < ENDWHILE : "endwhile" > +| +| +| +| } /* TYPES */ @@ -398,20 +415,30 @@ MORE : < STRING_LITERAL: ( | | )> | < STRING_1: "\"" - ( (~["\""]) - | "\\\"" + ( + ~["\""] + | + "\\\"" )* "\"" > | < STRING_2: "'" - ( (~["'"]))* + ( + ~["'"] + | + "\\'" + )* "'" > | < STRING_3: "`" - ( (~["`"]))* + ( + ~["`"] + | + "\\`" + )* "`" > } @@ -431,7 +458,7 @@ MORE : > | < #SPECIAL: - "_" + "_" | ["\u007f"-"\u00ff"] > } @@ -456,43 +483,46 @@ 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: ">>>=" > +| " > +| +| +| +| +| +| =" > +| " > +| +| +| +| +| +| +| +| +| +| +| +| +| +| >" > +| >>" > +| +| >=" > +| +| +| (token = | token = ) + {return "+" + token.image;} +| + expr = ArrayDeclarator() + {return expr;} +| + token = + {return token.image;} } String ArrayVariable() : @@ -736,12 +796,16 @@ void MethodDeclaration() : { functionDeclaration = MethodDeclarator() { - currentSegment.add(functionDeclaration); - currentSegment = functionDeclaration; + if (currentSegment != null) { + currentSegment.add(functionDeclaration); + currentSegment = functionDeclaration; + } } Block() { - currentSegment = (PHPSegmentWithChildren) currentSegment.getParent(); + if (currentSegment != null) { + currentSegment = (PHPSegmentWithChildren) currentSegment.getParent(); + } } } @@ -835,6 +899,9 @@ String Type() : | {return "integer";} +| + + {return "object";} } String Expression() : @@ -850,7 +917,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) { @@ -862,9 +935,7 @@ String Expression() : } String AssignmentOperator() : -{ - Token assignOperator; -} +{} { {return "=";} @@ -882,8 +953,6 @@ String AssignmentOperator() : {return "<<=";} | {return ">>=";} -| -{return ">>>=";} | {return "&=";} | @@ -892,6 +961,8 @@ String AssignmentOperator() : {return "|=";} | {return ".=";} +| +{return "~=";} } String ConditionalExpression() : @@ -1062,7 +1133,13 @@ String EqualityExpression() : expr = RelationalExpression() {buff.append(expr);} ( - ( operator = | operator = ) expr2 = RelationalExpression() + ( operator = + | operator = + | operator = + | operator = + | operator = + ) + expr2 = RelationalExpression() { buff.append(operator.image); buff.append(expr2); @@ -1149,19 +1226,37 @@ String MultiplicativeExpression() : {return buff.toString();} } +/** + * An unary expression starting with @, & or nothing + */ String UnaryExpression() : { String expr; + 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() @@ -1174,6 +1269,7 @@ String UnaryExpression() : {return expr;} } + String PreIncrementExpression() : { String expr; @@ -1259,6 +1355,15 @@ String PrimaryExpression() : ( expr = PrimarySuffix() {buff.append(expr);} )* {return buff.toString();} | + expr = ArrayDeclarator() + {return "array" + expr;} +} + +String ArrayDeclarator() : +{ + String expr; +} +{ expr = ArrayInitializer() {return "array" + expr;} } @@ -1272,12 +1377,9 @@ String PrimaryPrefix() : token = {return token.image;} | - [token = ] expr = ClassIdentifier() + expr = ClassIdentifier() { - if (token == null) { - return "new " + expr; - } - return "new &" + expr; + return "new " + expr; } | expr = VariableDeclaratorId() @@ -1317,7 +1419,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 "[]"; @@ -1338,14 +1447,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;} @@ -1423,7 +1526,14 @@ void Statement() : {} { LOOKAHEAD(2) - Expression() ( | "?>") + Expression() + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } | LOOKAHEAD(2) LabeledStatement() @@ -1451,6 +1561,8 @@ void Statement() : | ForStatement() | + ForeachStatement() +| BreakStatement() | ContinueStatement() @@ -1468,34 +1580,69 @@ void Statement() : void IncludeStatement() : { - Token token; String expr; - int pos; + int pos = jj_input_stream.bufpos; } { - token = - {pos = token.beginLine;} + expr = Expression() - {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require",pos,expr));} - ( | "?>") + { + if (currentSegment != null) { + currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require",pos,expr)); + } + } + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } | - token = - {pos = token.beginLine;} + expr = Expression() - {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require_once",pos,expr));} - ( | "?>") + { + if (currentSegment != null) { + currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require_once",pos,expr)); + } + } + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } | - token = - {pos = token.beginLine;} + expr = Expression() - {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include",pos,expr));} - ( | "?>") + { + if (currentSegment != null) { + currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include",pos,expr)); + } + } + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } | - token = - {pos = token.beginLine;} + expr = Expression() - {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include_once",pos,expr));} - ( | "?>") + { + if (currentSegment != null) { + currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include_once",pos,expr)); + } + } + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected"; + errorLevel = ERROR; + throw e; + } } String PrintExpression() : @@ -1527,13 +1674,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() : @@ -1579,11 +1740,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() @@ -1624,7 +1780,7 @@ void IfStatement() : */ {} { - Condition("if") Statement() ( LOOKAHEAD(1) ElseIfStatement() )* [ LOOKAHEAD(1) Statement() ] + Condition("if") IfStatement0() } void Condition(String keyword) : @@ -1647,6 +1803,39 @@ void Condition(String keyword) : } } +void IfStatement0() : +{} +{ + (Statement())* (ElseIfStatementColon())* [ElseStatementColon()] + try { + + } catch (ParseException e) { + errorMessage = "';' expected 'endif' keyword"; + errorLevel = ERROR; + throw e; + } +| + Statement() ( LOOKAHEAD(1) ElseIfStatement() )* [ LOOKAHEAD(1) Statement() ] +} + +void ElseIfStatementColon() : +{} +{ + Condition("elseif") (Statement())* +} + +void ElseStatement() : +{} +{ + Statement() +} + +void ElseStatementColon() : +{} +{ + (Statement())* +} + void ElseIfStatement() : {} { @@ -1662,7 +1851,14 @@ void WhileStatement() : void WhileStatement0() : {} { - (Statement())* ( | "?>") + (Statement())* + try { + ( | "?>") + } catch (ParseException e) { + errorMessage = "';' expected after 'endwhile' keyword"; + errorLevel = ERROR; + throw e; + } | Statement() } @@ -1670,13 +1866,38 @@ 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() : {} { - [ ForInit() ] [ Expression() ] [ ForUpdate() ] Statement() + [ ForInit() ] [ Expression() ] [ ForUpdate() ] + ( + Statement() + | + (Statement())* + try { + + } catch (ParseException e) { + errorMessage = "';' expected 'endfor' keyword"; + errorLevel = ERROR; + throw e; + } + ) } void ForInit() :