X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/test/PHPParser.jj b/net.sourceforge.phpeclipse/src/test/PHPParser.jj index 861d2c6..e3b05cf 100644 --- a/net.sourceforge.phpeclipse/src/test/PHPParser.jj +++ b/net.sourceforge.phpeclipse/src/test/PHPParser.jj @@ -48,7 +48,7 @@ import net.sourceforge.phpdt.internal.compiler.parser.PHPReqIncDeclaration; * You can test the parser with the PHPParserTestCase2.java * @author Matthieu Casanova */ -public class PHPParser extends PHPParserSuperclass { +public final class PHPParser extends PHPParserSuperclass { private static IFile fileToParse; @@ -64,7 +64,7 @@ public class PHPParser extends PHPParserSuperclass { public PHPParser() { } - public void setFileToParse(IFile fileToParse) { + public final void setFileToParse(IFile fileToParse) { this.fileToParse = fileToParse; } @@ -73,7 +73,7 @@ public class PHPParser extends PHPParserSuperclass { this.fileToParse = fileToParse; } - public void phpParserTester(String strEval) throws CoreException, ParseException { + public static final void phpParserTester(String strEval) throws CoreException, ParseException { PHPParserTokenManager.SwitchTo(PHPParserTokenManager.PHPPARSING); StringReader stream = new StringReader(strEval); if (jj_input_stream == null) { @@ -83,7 +83,7 @@ public class PHPParser extends PHPParserSuperclass { phpTest(); } - public void htmlParserTester(String strEval) throws CoreException, ParseException { + public static final void htmlParserTester(String strEval) throws CoreException, ParseException { StringReader stream = new StringReader(strEval); if (jj_input_stream == null) { jj_input_stream = new SimpleCharStream(stream, 1, 1); @@ -92,7 +92,7 @@ public class PHPParser extends PHPParserSuperclass { phpFile(); } - public PHPOutlineInfo parseInfo(Object parent, String s) { + public final PHPOutlineInfo parseInfo(Object parent, String s) { outlineInfo = new PHPOutlineInfo(parent); currentSegment = outlineInfo.getDeclarations(); StringReader stream = new StringReader(s); @@ -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); } @@ -196,8 +201,12 @@ public class PHPParser extends PHPParserSuperclass { } } - public void parse(String s) throws CoreException { - ReInit(new StringReader(s)); + public final void parse(String s) throws CoreException { + 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) { @@ -227,7 +236,7 @@ public class PHPParser extends PHPParserSuperclass { } } - public void parse() throws ParseException { + public static final void parse() throws ParseException { phpFile(); } } @@ -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 */ @@ -441,7 +458,7 @@ MORE : > | < #SPECIAL: - "_" + "_" | ["\u007f"-"\u00ff"] > } @@ -476,6 +493,7 @@ MORE : | =" > | " > | | | @@ -502,7 +520,9 @@ MORE : | >=" > -| >>=" > +| +| +| ' expected"; + errorLevel = ERROR; + throw e; + } + )* + } catch (TokenMgrError e) { + errorMessage = e.getMessage(); + errorLevel = ERROR; + throw generateParseException(); + } } void Php() : @@ -542,18 +576,22 @@ void ClassDeclaration() : { PHPClassDeclaration classDeclaration; Token className; - int pos = jj_input_stream.bufpos; + final int pos = jj_input_stream.bufpos; } { className = [ ] { - classDeclaration = new PHPClassDeclaration(currentSegment,className.image,pos); - currentSegment.add(classDeclaration); - currentSegment = classDeclaration; + if (currentSegment != null) { + classDeclaration = new PHPClassDeclaration(currentSegment,className.image,pos); + currentSegment.add(classDeclaration); + currentSegment = classDeclaration; + } } ClassBody() { - currentSegment = (PHPSegmentWithChildren) currentSegment.getParent(); + if (currentSegment != null) { + currentSegment = (PHPSegmentWithChildren) currentSegment.getParent(); + } } } @@ -591,10 +629,18 @@ void FieldDeclaration() : } { variableDeclaration = VariableDeclarator() - {currentSegment.add(variableDeclaration);} + { + if (currentSegment != null) { + currentSegment.add(variableDeclaration); + } + } ( - variableDeclaration = VariableDeclarator() - {currentSegment.add(variableDeclaration);} + variableDeclaration = VariableDeclarator() + { + if (currentSegment != null) { + currentSegment.add(variableDeclaration); + } + } )* try { @@ -609,7 +655,7 @@ PHPVarDeclaration VariableDeclarator() : { String varName; String varValue = null; - int pos = jj_input_stream.bufpos; + final int pos = jj_input_stream.bufpos; } { varName = VariableDeclaratorId() @@ -634,7 +680,7 @@ PHPVarDeclaration VariableDeclarator() : String VariableDeclaratorId() : { String expr; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { try { @@ -701,19 +747,29 @@ Token token; String VariableInitializer() : { String expr; + Token token; } { expr = Literal() {return expr;} | + (token = | token = ) + {return "-" + token.image;} +| + (token = | token = ) + {return "+" + token.image;} +| expr = ArrayDeclarator() {return expr;} +| + token = + {return token.image;} } String ArrayVariable() : { String expr; -StringBuffer buff = new StringBuffer(); +final StringBuffer buff = new StringBuffer(); } { expr = Expression() @@ -726,7 +782,7 @@ StringBuffer buff = new StringBuffer(); String ArrayInitializer() : { String expr = null; -StringBuffer buff = new StringBuffer("("); +final StringBuffer buff = new StringBuffer("("); } { [ expr = ArrayVariable() @@ -748,12 +804,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(); + } } } @@ -762,7 +822,7 @@ PHPFunctionDeclaration MethodDeclarator() : Token identifier; StringBuffer methodDeclaration = new StringBuffer(); String formalParameters; - int pos = jj_input_stream.bufpos; + final int pos = jj_input_stream.bufpos; } { [ {methodDeclaration.append("&");} ] @@ -811,7 +871,7 @@ String FormalParameters() : String FormalParameter() : { PHPVarDeclaration variableDeclaration; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { [ {buff.append("&");}] variableDeclaration = VariableDeclarator() @@ -847,6 +907,9 @@ String Type() : | {return "integer";} +| + + {return "object";} } String Expression() : @@ -867,7 +930,7 @@ String Expression() : } catch (ParseException e) { errorMessage = "expression expected"; errorLevel = ERROR; - throw generateParseException(); + throw e; } ] { @@ -898,8 +961,6 @@ String AssignmentOperator() : {return "<<=";} | {return ">>=";} -| -{return ">>>=";} | {return "&=";} | @@ -908,6 +969,8 @@ String AssignmentOperator() : {return "|=";} | {return ".=";} +| +{return "~=";} } String ConditionalExpression() : @@ -932,7 +995,7 @@ String ConditionalOrExpression() : String expr; Token operator; String expr2 = null; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = ConditionalAndExpression() @@ -956,7 +1019,7 @@ String ConditionalAndExpression() : String expr; Token operator; String expr2 = null; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = ConcatExpression() @@ -979,7 +1042,7 @@ String ConcatExpression() : { String expr; String expr2 = null; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = InclusiveOrExpression() @@ -1002,7 +1065,7 @@ String InclusiveOrExpression() : { String expr; String expr2 = null; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = ExclusiveOrExpression() @@ -1025,7 +1088,7 @@ String ExclusiveOrExpression() : { String expr; String expr2 = null; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = AndExpression() @@ -1046,9 +1109,9 @@ String ExclusiveOrExpression() : String AndExpression() : { - String expr; + final String expr; String expr2 = null; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = EqualityExpression() @@ -1072,13 +1135,19 @@ String EqualityExpression() : String expr; Token operator; String expr2; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = RelationalExpression() {buff.append(expr);} ( - ( operator = | operator = ) expr2 = RelationalExpression() + ( operator = + | operator = + | operator = + | operator = + | operator = + ) + expr2 = RelationalExpression() { buff.append(operator.image); buff.append(expr2); @@ -1092,7 +1161,7 @@ String RelationalExpression() : String expr; Token operator; String expr2; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = ShiftExpression() @@ -1111,17 +1180,16 @@ String ShiftExpression() : { String expr; Token operator; - String expr2; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = AdditiveExpression() {buff.append(expr);} ( - (operator = | operator = | operator = ) expr2 = AdditiveExpression() + (operator = | operator = | operator = ) expr = AdditiveExpression() { buff.append(operator.image); - buff.append(expr2); + buff.append(expr); } )* {return buff.toString();} @@ -1131,17 +1199,16 @@ String AdditiveExpression() : { String expr; Token operator; - String expr2; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = MultiplicativeExpression() {buff.append(expr);} ( - ( operator = | operator = ) expr2 = MultiplicativeExpression() + ( operator = | operator = ) expr = MultiplicativeExpression() { buff.append(operator.image); - buff.append(expr2); + buff.append(expr); } )* {return buff.toString();} @@ -1149,31 +1216,50 @@ String AdditiveExpression() : String MultiplicativeExpression() : { - String expr, expr2; + String expr; Token operator; final StringBuffer buff = new StringBuffer();} { expr = UnaryExpression() {buff.append(expr);} ( - ( operator = | operator = | operator = ) expr2 = UnaryExpression() + ( operator = | operator = | operator = ) expr = UnaryExpression() { buff.append(operator.image); - buff.append(expr2); + buff.append(expr); } )* {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("@");})* expr = UnaryExpressionNoPrefix() + {return buff.append(expr).toString();} +} + +String UnaryExpressionNoPrefix() : +{ + String expr; + Token token; +} +{ ( token = | token = ) expr = UnaryExpression() { return token.image + expr; @@ -1189,6 +1275,7 @@ String UnaryExpression() : {return expr;} } + String PreIncrementExpression() : { String expr; @@ -1231,8 +1318,7 @@ String UnaryExpressionNotPlusMinus() : String CastExpression() : { -String type; -String expr; +final String type, expr; } { type = Type() expr = UnaryExpression() @@ -1280,7 +1366,7 @@ String PrimaryExpression() : String ArrayDeclarator() : { - String expr; + final String expr; } { expr = ArrayInitializer() @@ -1296,12 +1382,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() @@ -1347,7 +1430,7 @@ String VariableSuffix() : } catch (ParseException e) { errorMessage = "']' expected"; errorLevel = ERROR; - throw generateParseException(); + throw e; } { if(expr == null) { @@ -1369,14 +1452,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;} @@ -1426,7 +1503,7 @@ String expr = null; String ArgumentList() : { String expr; -StringBuffer buff = new StringBuffer(); +final StringBuffer buff = new StringBuffer(); } { expr = Expression() @@ -1489,6 +1566,8 @@ void Statement() : | ForStatement() | + ForeachStatement() +| BreakStatement() | ContinueStatement() @@ -1507,12 +1586,16 @@ void Statement() : void IncludeStatement() : { String expr; - int pos = jj_input_stream.bufpos; + final int pos = jj_input_stream.bufpos; } { 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) { @@ -1523,7 +1606,11 @@ void IncludeStatement() : | 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) { @@ -1534,7 +1621,11 @@ void IncludeStatement() : | 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) { @@ -1545,7 +1636,11 @@ void IncludeStatement() : | 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) { @@ -1557,7 +1652,7 @@ void IncludeStatement() : String PrintExpression() : { - StringBuffer buff = new StringBuffer("print "); + final StringBuffer buff = new StringBuffer("print "); String expr; } { @@ -1688,9 +1783,12 @@ void IfStatement() : * else's to the innermost if statement. The LOOKAHEAD specification * is to tell JavaCC that we know what we are doing. */ -{} { - Condition("if") Statement() ( LOOKAHEAD(1) ElseIfStatement() )* [ LOOKAHEAD(1) Statement() ] + Token token; + final int pos = jj_input_stream.bufpos; +} +{ + token = Condition("if") IfStatement0(pos,pos+token.image.length()) } void Condition(String keyword) : @@ -1713,6 +1811,52 @@ void Condition(String keyword) : } } +void IfStatement0(int start,int end) : +{ +} +{ + (Statement())* (ElseIfStatementColon())* [ElseStatementColon()] + + {try { + setMarker(fileToParse, + "Ugly syntax detected, you should if () {...} instead of if (): ... endif;", + start, + end, + INFO, + "Line " + token.beginLine); + } catch (CoreException e) { + PHPeclipsePlugin.log(e); + }} + try { + + } catch (ParseException e) { + errorMessage = "'endif' expected"; + errorLevel = ERROR; + throw e; + } + 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 ElseStatementColon() : +{} +{ + (Statement())* +} + void ElseIfStatement() : {} { @@ -1720,19 +1864,39 @@ void ElseIfStatement() : } void WhileStatement() : -{} { - Condition("while") WhileStatement0() + Token token; + final int pos = jj_input_stream.bufpos; +} +{ + token = Condition("while") WhileStatement0(pos,pos + token.image.length()) } -void WhileStatement0() : +void WhileStatement0(final int start, final int end) : {} { - (Statement())* + (Statement())* + {try { + setMarker(fileToParse, + "Ugly syntax detected, you should while () {...} instead of while (): ... endwhile;", + start, + end, + INFO, + "Line " + token.beginLine); + } catch (CoreException e) { + PHPeclipsePlugin.log(e); + }} + try { + + } catch (ParseException e) { + errorMessage = "'endwhile' expected"; + errorLevel = ERROR; + throw e; + } try { ( | "?>") } catch (ParseException e) { - errorMessage = "';' expected"; + errorMessage = "';' expected after 'endwhile' keyword"; errorLevel = ERROR; throw e; } @@ -1753,10 +1917,102 @@ void DoStatement() : } } -void ForStatement() : +void ForeachStatement() : {} { - [ ForInit() ] [ Expression() ] [ ForUpdate() ] Statement() + + try { + + } catch (ParseException e) { + errorMessage = "'(' expected after 'foreach' keyword"; + errorLevel = ERROR; + throw e; + } + try { + Variable() + } catch (ParseException e) { + errorMessage = "variable expected"; + errorLevel = ERROR; + throw e; + } + try { + + } catch (ParseException e) { + errorMessage = "'as' expected"; + errorLevel = ERROR; + throw e; + } + try { + Variable() + } catch (ParseException e) { + errorMessage = "variable expected"; + errorLevel = ERROR; + throw e; + } + [ Expression() ] + try { + + } catch (ParseException e) { + errorMessage = "')' expected after 'foreach' keyword"; + errorLevel = ERROR; + throw e; + } + try { + Statement() + } catch (ParseException e) { + if (errorMessage != null) throw e; + errorMessage = "statement expected"; + errorLevel = ERROR; + throw e; + } +} + +void ForStatement() : +{ +Token token; +final int pos = jj_input_stream.bufpos; +} +{ + token = + try { + + } catch (ParseException e) { + errorMessage = "'(' expected after 'for' keyword"; + errorLevel = ERROR; + throw e; + } + [ ForInit() ] [ Expression() ] [ ForUpdate() ] + ( + Statement() + | + (Statement())* + { + try { + setMarker(fileToParse, + "Ugly syntax detected, you should for () {...} instead of for (): ... endfor;", + pos, + pos+token.image.length(), + INFO, + "Line " + token.beginLine); + } catch (CoreException e) { + PHPeclipsePlugin.log(e); + } + } + try { + + } catch (ParseException e) { + errorMessage = "'endfor' expected"; + errorLevel = ERROR; + throw e; + } + try { + + } catch (ParseException e) { + errorMessage = "';' expected 'endfor' keyword"; + errorLevel = ERROR; + throw e; + } + ) } void ForInit() :