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 861d2c6..21cdb6f 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,18 +64,18 @@ public class PHPParser extends PHPParserSuperclass { public PHPParser() { } - public void setFileToParse(IFile fileToParse) { + public final void setFileToParse(final IFile fileToParse) { this.fileToParse = fileToParse; } - public PHPParser(IFile fileToParse) { + public PHPParser(final IFile fileToParse) { this(new StringReader("")); this.fileToParse = fileToParse; } - public void phpParserTester(String strEval) throws CoreException, ParseException { + public static final void phpParserTester(final String strEval) throws CoreException, ParseException { PHPParserTokenManager.SwitchTo(PHPParserTokenManager.PHPPARSING); - StringReader stream = new StringReader(strEval); + final StringReader stream = new StringReader(strEval); if (jj_input_stream == null) { jj_input_stream = new SimpleCharStream(stream, 1, 1); } @@ -83,8 +83,8 @@ public class PHPParser extends PHPParserSuperclass { phpTest(); } - public void htmlParserTester(String strEval) throws CoreException, ParseException { - StringReader stream = new StringReader(strEval); + public static final void htmlParserTester(final String strEval) throws CoreException, ParseException { + final StringReader stream = new StringReader(strEval); if (jj_input_stream == null) { jj_input_stream = new SimpleCharStream(stream, 1, 1); } @@ -92,10 +92,10 @@ public class PHPParser extends PHPParserSuperclass { phpFile(); } - public PHPOutlineInfo parseInfo(Object parent, String s) { + public final PHPOutlineInfo parseInfo(final Object parent, final String s) { outlineInfo = new PHPOutlineInfo(parent); currentSegment = outlineInfo.getDeclarations(); - StringReader stream = new StringReader(s); + final StringReader stream = new StringReader(s); if (jj_input_stream == null) { jj_input_stream = new SimpleCharStream(stream, 1, 1); } @@ -124,10 +124,16 @@ public class PHPParser extends PHPParserSuperclass { /** * Create marker for the parse error + * @param e the ParseException */ - private static void setMarker(ParseException e) { + private static void setMarker(final 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); } @@ -136,12 +142,12 @@ public class PHPParser extends PHPParserSuperclass { /** * Create markers according to the external parser output */ - private static void createMarkers(String output, IFile file) throws CoreException { + private static void createMarkers(final String output, final IFile file) throws CoreException { // delete all markers file.deleteMarkers(IMarker.PROBLEM, false, 0); int indx = 0; - int brIndx = 0; + int brIndx; boolean flag = true; while ((brIndx = output.indexOf("
", indx)) != -1) { // newer php error output (tested with 4.2.3) @@ -158,7 +164,10 @@ public class PHPParser extends PHPParserSuperclass { } } - private static void scanLine(String output, IFile file, int indx, int brIndx) throws CoreException { + private static void scanLine(final String output, + final IFile file, + final int indx, + final int brIndx) throws CoreException { String current; StringBuffer lineNumberBuffer = new StringBuffer(10); char ch; @@ -196,8 +205,12 @@ public class PHPParser extends PHPParserSuperclass { } } - public void parse(String s) throws CoreException { - ReInit(new StringReader(s)); + public final void parse(final String s) throws CoreException { + final 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) { @@ -209,15 +222,15 @@ public class PHPParser extends PHPParserSuperclass { * Call the php parse command ( php -l -f <filename> ) * and create markers according to the external parser output */ - public static void phpExternalParse(IFile file) { - IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore(); - String filename = file.getLocation().toString(); + public static void phpExternalParse(final IFile file) { + final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore(); + final String filename = file.getLocation().toString(); - String[] arguments = { filename }; - MessageFormat form = new MessageFormat(store.getString(PHPeclipsePlugin.EXTERNAL_PARSER_PREF)); - String command = form.format(arguments); + final String[] arguments = { filename }; + final MessageFormat form = new MessageFormat(store.getString(PHPeclipsePlugin.EXTERNAL_PARSER_PREF)); + final String command = form.format(arguments); - String parserResult = PHPStartApacheAction.getParserOutput(command, "External parser: "); + final String parserResult = PHPStartApacheAction.getParserOutput(command, "External parser: "); try { // parse the buffer to find the errors and warnings @@ -227,7 +240,7 @@ public class PHPParser extends PHPParserSuperclass { } } - public void parse() throws ParseException { + public static final void parse() throws ParseException { phpFile(); } } @@ -236,7 +249,9 @@ PARSER_END(PHPParser) TOKEN : { - : PHPPARSING + : PHPPARSING +| : PHPPARSING +| { input_stream.backup(1); } : IN_FORMAL_COMMENT | "/*" : IN_MULTI_LINE_COMMENT } - -SPECIAL_TOKEN : + SPECIAL_TOKEN : +{ + : PHPPARSING +} + + SPECIAL_TOKEN : { - " > : PHPPARSING + " > : DEFAULT } @@ -306,68 +325,76 @@ MORE : | | | +| } /* LANGUAGE CONSTRUCT */ TOKEN : { - -| -| -| -| -| -| -| -| "> -| -| "> + +| +| +| +| +| +| +| +| "> +| +| "> } + TOKEN : +{ + +} /* RESERVED WORDS AND LITERALS */ TOKEN : { - < BREAK: "break" > -| < CASE: "case" > -| < CONST: "const" > -| < CONTINUE: "continue" > -| < _DEFAULT: "default" > -| < DO: "do" > -| < EXTENDS: "extends" > -| < FALSE: "false" > -| < FOR: "for" > -| < GOTO: "goto" > -| < NEW: "new" > -| < NULL: "null" > -| < RETURN: "return" > -| < SUPER: "super" > -| < SWITCH: "switch" > -| < THIS: "this" > -| < TRUE: "true" > -| < WHILE: "while" > -| < ENDWHILE : "endwhile" > + +| +| +| <_DEFAULT : "default"> +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| } /* TYPES */ TOKEN : { - -| -| + +| +| | -| -| -| -| +| +| +| +| | } TOKEN : { - < _ORL : "OR" > -| < _ANDL: "AND"> + <_ORL : "OR"> +| <_ANDL : "AND"> } /* LITERALS */ @@ -441,7 +468,7 @@ MORE : > | < #SPECIAL: - "_" + "_" | ["\u007f"-"\u00ff"] > } @@ -449,74 +476,79 @@ MORE : TOKEN : { - < LPAREN: "(" > -| < RPAREN: ")" > -| < LBRACE: "{" > -| < RBRACE: "}" > -| < LBRACKET: "[" > -| < RBRACKET: "]" > -| < SEMICOLON: ";" > -| < COMMA: "," > -| < DOT: "." > + +| +| +| +| +| +| +| +| } -/* OPERATORS */ +/* COMPARATOR */ TOKEN : { - -| -| " > -| -| -| -| -| -| =" > -| -| -| -| -| -| -| -| -| -| -| -| -| -| >" > -| >>" > -| -| >=" > -| >>=" > + "> +| +| +| ="> +| "> +| +| } +/* ASSIGNATION */ TOKEN : { - < DOLLAR_ID: > + +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| >"> +| >>"> +| >="> +} -/* - * Program structuring syntax follows. - */ + TOKEN : +{ + < DOLLAR_ID: > +} void phpTest() : {} @@ -528,8 +560,44 @@ void phpTest() : void phpFile() : {} { - ( Php() )* - + try { + (PhpBlock())* + + } catch (TokenMgrError e) { + errorMessage = e.getMessage(); + errorLevel = ERROR; + throw generateParseException(); + } +} + +void PhpBlock() : +{ + final int start = jj_input_stream.bufpos; +} +{ + Expression() [ ] +| + [ + | + {try { + setMarker(fileToParse, + "You should use ' + } catch (ParseException e) { + errorMessage = "'?>' expected"; + errorLevel = ERROR; + throw e; + } } void Php() : @@ -540,20 +608,24 @@ void Php() : void ClassDeclaration() : { - PHPClassDeclaration classDeclaration; - Token className; - int pos = jj_input_stream.bufpos; + final PHPClassDeclaration classDeclaration; + final Token className; + 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 +663,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 { @@ -607,9 +687,9 @@ void FieldDeclaration() : PHPVarDeclaration VariableDeclarator() : { - String varName; - String varValue = null; - int pos = jj_input_stream.bufpos; + final String varName; + String varValue; + final int pos = jj_input_stream.bufpos; } { varName = VariableDeclaratorId() @@ -617,24 +697,20 @@ PHPVarDeclaration VariableDeclarator() : try { varValue = VariableInitializer() + {return new PHPVarDeclaration(currentSegment,varName,pos,varValue);} } catch (ParseException e) { errorMessage = "Literal expression expected in variable initializer"; errorLevel = ERROR; throw e; } ] - { - if (varValue == null) { - return new PHPVarDeclaration(currentSegment,varName,pos); - } - return new PHPVarDeclaration(currentSegment,varName,pos,varValue); - } + {return new PHPVarDeclaration(currentSegment,varName,pos);} } String VariableDeclaratorId() : { String expr; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { try { @@ -654,7 +730,7 @@ String VariableDeclaratorId() : String Variable(): { String expr = null; - Token token; + final Token token; } { token = [ expr = Expression() ] @@ -672,7 +748,7 @@ String Variable(): String VariableName(): { String expr = null; -Token token; +final Token token; } { expr = Expression() @@ -700,20 +776,30 @@ Token token; String VariableInitializer() : { - String expr; + final String expr; + final 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() @@ -725,8 +811,8 @@ StringBuffer buff = new StringBuffer(); String ArrayInitializer() : { -String expr = null; -StringBuffer buff = new StringBuffer("("); +String expr; +final StringBuffer buff = new StringBuffer("("); } { [ expr = ArrayVariable() @@ -743,26 +829,40 @@ StringBuffer buff = new StringBuffer("("); void MethodDeclaration() : { - PHPFunctionDeclaration functionDeclaration; + final PHPFunctionDeclaration functionDeclaration; } { - functionDeclaration = MethodDeclarator() + + try { + functionDeclaration = MethodDeclarator() + } catch (ParseException e) { + if (errorMessage != null) { + throw e; + } + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', function identifier expected"; + errorLevel = ERROR; + throw e; + } { - 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(); + } } } PHPFunctionDeclaration MethodDeclarator() : { - Token identifier; - StringBuffer methodDeclaration = new StringBuffer(); - String formalParameters; - int pos = jj_input_stream.bufpos; + final Token identifier; + final StringBuffer methodDeclaration = new StringBuffer(); + final String formalParameters; + final int pos = jj_input_stream.bufpos; } { [ {methodDeclaration.append("&");} ] @@ -810,8 +910,8 @@ String FormalParameters() : String FormalParameter() : { - PHPVarDeclaration variableDeclaration; - StringBuffer buff = new StringBuffer(); + final PHPVarDeclaration variableDeclaration; + final StringBuffer buff = new StringBuffer(); } { [ {buff.append("&");}] variableDeclaration = VariableDeclarator() @@ -847,36 +947,37 @@ String Type() : | {return "integer";} +| + + {return "object";} } String Expression() : { - String expr; - String assignOperator = null; - String expr2 = null; + final String expr; + final String assignOperator; + final String expr2; } { expr = PrintExpression() {return expr;} | + expr = ListExpression() + {return expr;} +| expr = ConditionalExpression() [ assignOperator = AssignmentOperator() try { expr2 = Expression() + {return expr + assignOperator + expr2;} } catch (ParseException e) { errorMessage = "expression expected"; errorLevel = ERROR; - throw generateParseException(); + throw e; } ] - { - if (expr2 == null) { - return expr; - } else { - return expr + assignOperator + expr2; - } - } + {return expr;} } String AssignmentOperator() : @@ -898,8 +999,6 @@ String AssignmentOperator() : {return "<<=";} | {return ">>=";} -| -{return ">>>=";} | {return "&=";} | @@ -908,11 +1007,13 @@ String AssignmentOperator() : {return "|=";} | {return ".=";} +| +{return "~=";} } String ConditionalExpression() : { - String expr; + final String expr; String expr2 = null; String expr3 = null; } @@ -931,19 +1032,16 @@ String ConditionalOrExpression() : { String expr; Token operator; - String expr2 = null; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = ConditionalAndExpression() - { - buff.append(expr); - } + {buff.append(expr);} ( - (operator = | operator = <_ORL>) expr2 = ConditionalAndExpression() + (operator = | operator = <_ORL>) expr = ConditionalAndExpression() { buff.append(operator.image); - buff.append(expr2); + buff.append(expr); } )* { @@ -955,77 +1053,55 @@ String ConditionalAndExpression() : { String expr; Token operator; - String expr2 = null; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = ConcatExpression() - { - buff.append(expr); - } + {buff.append(expr);} ( - (operator = | operator = <_ANDL>) expr2 = ConcatExpression() + (operator = | operator = <_ANDL>) expr = ConcatExpression() { buff.append(operator.image); - buff.append(expr2); + buff.append(expr); } )* - { - return buff.toString(); - } + {return buff.toString();} } String ConcatExpression() : { String expr; - String expr2 = null; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = InclusiveOrExpression() - { - buff.append(expr); - } + {buff.append(expr);} ( - expr2 = InclusiveOrExpression() - { - buff.append("."); - buff.append(expr2); - } + expr = InclusiveOrExpression() + {buff.append(".").append(expr);} )* - { - return buff.toString(); - } + {return buff.toString();} } String InclusiveOrExpression() : { String expr; - String expr2 = null; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = ExclusiveOrExpression() - { - buff.append(expr); - } + {buff.append(expr);} ( - expr2 = ExclusiveOrExpression() - { - buff.append("|"); - buff.append(expr2); - } + expr = ExclusiveOrExpression() + {buff.append("|").append(expr);} )* - { - return buff.toString(); - } + {return buff.toString();} } String ExclusiveOrExpression() : { String expr; - String expr2 = null; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = AndExpression() @@ -1033,10 +1109,10 @@ String ExclusiveOrExpression() : buff.append(expr); } ( - expr2 = AndExpression() + expr = AndExpression() { buff.append("^"); - buff.append(expr2); + buff.append(expr); } )* { @@ -1047,8 +1123,7 @@ String ExclusiveOrExpression() : String AndExpression() : { String expr; - String expr2 = null; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = EqualityExpression() @@ -1056,32 +1131,34 @@ String AndExpression() : buff.append(expr); } ( - expr2 = EqualityExpression() + expr = EqualityExpression() { - buff.append("&"); - buff.append(expr2); + buff.append("&").append(expr); } )* - { - return buff.toString(); - } + {return buff.toString();} } 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 = + ) + expr = RelationalExpression() { buff.append(operator.image); - buff.append(expr2); + buff.append(expr); } )* {return buff.toString();} @@ -1091,18 +1168,14 @@ String RelationalExpression() : { String expr; Token operator; - String expr2; - StringBuffer buff = new StringBuffer(); + final StringBuffer buff = new StringBuffer(); } { expr = ShiftExpression() {buff.append(expr);} ( - ( operator = | operator = | operator = | operator = ) expr2 = ShiftExpression() - { - buff.append(operator.image); - buff.append(expr2); - } + ( operator = | operator = | operator = | operator = ) expr = ShiftExpression() + {buff.append(operator.image).append(expr);} )* {return buff.toString();} } @@ -1111,17 +1184,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 +1203,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 +1220,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 String expr; + final 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() : +{ + final String expr; + final Token token; +} +{ ( token = | token = ) expr = UnaryExpression() { return token.image + expr; @@ -1189,9 +1279,10 @@ String UnaryExpression() : {return expr;} } + String PreIncrementExpression() : { -String expr; +final String expr; } { expr = PrimaryExpression() @@ -1200,7 +1291,7 @@ String expr; String PreDecrementExpression() : { -String expr; +final String expr; } { expr = PrimaryExpression() @@ -1209,7 +1300,7 @@ String expr; String UnaryExpressionNotPlusMinus() : { - String expr; + final String expr; } { expr = UnaryExpression() @@ -1225,14 +1316,20 @@ String UnaryExpressionNotPlusMinus() : expr = Literal() {return expr;} | - expr = Expression() + expr = Expression() + try { + + } catch (ParseException e) { + errorMessage = "')' expected"; + errorLevel = ERROR; + throw e; + } {return "("+expr+")";} } String CastExpression() : { -String type; -String expr; +final String type, expr; } { type = Type() expr = UnaryExpression() @@ -1241,7 +1338,7 @@ String expr; String PostfixExpression() : { - String expr; + final String expr; Token operator = null; } { @@ -1256,7 +1353,7 @@ String PostfixExpression() : String PrimaryExpression() : { - Token identifier; + final Token identifier; String expr; final StringBuffer buff = new StringBuffer(); } @@ -1280,7 +1377,7 @@ String PrimaryExpression() : String ArrayDeclarator() : { - String expr; + final String expr; } { expr = ArrayInitializer() @@ -1289,19 +1386,16 @@ String ArrayDeclarator() : String PrimaryPrefix() : { - String expr; - Token token = null; + final String expr; + final Token token; } { token = {return token.image;} | - [token = ] expr = ClassIdentifier() + expr = ClassIdentifier() { - if (token == null) { - return "new " + expr; - } - return "new &" + expr; + return "new " + expr; } | expr = VariableDeclaratorId() @@ -1310,8 +1404,8 @@ String PrimaryPrefix() : String ClassIdentifier(): { - String expr; - Token token; + final String expr; + final Token token; } { token = @@ -1323,7 +1417,7 @@ String ClassIdentifier(): String PrimarySuffix() : { - String expr; + final String expr; } { expr = Arguments() @@ -1338,7 +1432,14 @@ String VariableSuffix() : String expr = null; } { - expr = VariableName() + + try { + expr = VariableName() + } catch (ParseException e) { + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', function call or field access expected"; + errorLevel = ERROR; + throw e; + } {return "->" + expr;} | [ expr = Expression() ] @@ -1347,7 +1448,7 @@ String VariableSuffix() : } catch (ParseException e) { errorMessage = "']' expected"; errorLevel = ERROR; - throw generateParseException(); + throw e; } { if(expr == null) { @@ -1359,8 +1460,8 @@ String VariableSuffix() : String Literal() : { - String expr; - Token token; + final String expr; + final Token token; } { token = @@ -1369,14 +1470,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;} @@ -1411,7 +1506,7 @@ String expr = null; try { } catch (ParseException e) { - errorMessage = "')' expected to close the argument list"; + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', ')' expected to close the argument list"; errorLevel = ERROR; throw e; } @@ -1426,7 +1521,7 @@ String expr = null; String ArgumentList() : { String expr; -StringBuffer buff = new StringBuffer(); +final StringBuffer buff = new StringBuffer(); } { expr = Expression() @@ -1440,23 +1535,22 @@ StringBuffer buff = new StringBuffer(); throw e; } { - buff.append(",").append("expr"); + buff.append(",").append(expr); } )* {return buff.toString();} } -/* - * Statement syntax follows. +/** + * A Statement without break */ - -void Statement() : +void StatementNoBreak() : {} { LOOKAHEAD(2) Expression() try { - ( | "?>") + ( | ) } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; @@ -1489,7 +1583,7 @@ void Statement() : | ForStatement() | - BreakStatement() + ForeachStatement() | ContinueStatement() | @@ -1504,15 +1598,30 @@ void Statement() : GlobalStatement() } +/** + * A Normal statement + */ +void Statement() : +{} +{ + StatementNoBreak() +| + BreakStatement() +} + void IncludeStatement() : { - String expr; - int pos = jj_input_stream.bufpos; + final String expr; + 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 +1632,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 +1647,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 +1662,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,8 +1678,8 @@ void IncludeStatement() : String PrintExpression() : { - StringBuffer buff = new StringBuffer("print "); - String expr; + final StringBuffer buff = new StringBuffer("print "); + final String expr; } { expr = Expression() @@ -1568,6 +1689,47 @@ String PrintExpression() : } } +String ListExpression() : +{ + final StringBuffer buff = new StringBuffer("list("); + String expr; +} +{ + + try { + + } catch (ParseException e) { + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', '(' expected"; + errorLevel = ERROR; + throw e; + } + [ + expr = VariableDeclaratorId() + {buff.append(expr);} + ] + [ + try { + + } catch (ParseException e) { + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', ',' expected"; + errorLevel = ERROR; + throw e; + } + expr = VariableDeclaratorId() + {buff.append(",").append(expr);} + ] + {buff.append(")");} + try { + + } catch (ParseException e) { + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', ')' expected"; + errorLevel = ERROR; + throw e; + } + [ expr = Expression() {buff.append("(").append(expr);}] + {return buff.toString();} +} + void EchoStatement() : {} { @@ -1624,7 +1786,13 @@ void Block() : throw e; } ( BlockStatement() )* - + try { + + } catch (ParseException e) { + errorMessage = "unexpected token : '"+ e.currentToken.image +"', '}' expected"; + errorLevel = ERROR; + throw e; + } } void BlockStatement() : @@ -1637,10 +1805,29 @@ void BlockStatement() : MethodDeclaration() } +/** + * A Block statement that will not contain any 'break' + */ +void BlockStatementNoBreak() : +{} +{ + StatementNoBreak() +| + ClassDeclaration() +| + MethodDeclaration() +} + void LocalVariableDeclaration() : {} { - VariableDeclarator() ( VariableDeclarator() )* + LocalVariableDeclarator() ( LocalVariableDeclarator() )* +} + +void LocalVariableDeclarator() : +{} +{ + VariableDeclaratorId() [ Expression() ] } void EmptyStatement() : @@ -1667,33 +1854,113 @@ void StatementExpression() : } void SwitchStatement() : -{} { - Expression() - ( SwitchLabel() ( BlockStatement() )* )* - + Token breakToken = null; + int line; +} +{ + + try { + + } catch (ParseException e) { + errorMessage = "'(' expected after 'switch'"; + errorLevel = ERROR; + throw e; + } + Expression() + try { + + } catch (ParseException e) { + errorMessage = "')' expected"; + errorLevel = ERROR; + throw e; + } + try { + + } catch (ParseException e) { + errorMessage = "'{' expected"; + errorLevel = ERROR; + throw e; + } + ( + line = SwitchLabel() + ( BlockStatementNoBreak() )* + [ breakToken = + try { + + } catch (ParseException e) { + errorMessage = "';' expected after 'break' keyword"; + errorLevel = ERROR; + throw e; + } + ] + { + try { + if (breakToken == null) { + setMarker(fileToParse, + "You should use put a 'break' at the end of your statement", + line, + INFO, + "Line " + line); + } + } catch (CoreException e) { + PHPeclipsePlugin.log(e); + } + } + )* + try { + + } catch (ParseException e) { + errorMessage = "'}' expected"; + errorLevel = ERROR; + throw e; + } } -void SwitchLabel() : -{} +int SwitchLabel() : { - Expression() + final Token token; +} +{ + token = + try { + Expression() + } catch (ParseException e) { + if (errorMessage != null) throw e; + errorMessage = "expression expected after 'case' keyword"; + errorLevel = ERROR; + throw e; + } + try { + + } catch (ParseException e) { + errorMessage = "':' expected after case expression"; + errorLevel = ERROR; + throw e; + } + {return token.beginLine;} | - <_DEFAULT> + token = <_DEFAULT> + try { + + } catch (ParseException e) { + errorMessage = "':' expected after 'default' keyword"; + errorLevel = ERROR; + throw e; + } + {return token.beginLine;} } void IfStatement() : -/* - * The disambiguating algorithm of JavaCC automatically binds dangling - * 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() ] + final Token token; + final int pos = jj_input_stream.bufpos; +} +{ + token = Condition("if") IfStatement0(pos,pos+token.image.length()) } -void Condition(String keyword) : +void Condition(final String keyword) : {} { try { @@ -1713,6 +1980,51 @@ void Condition(String keyword) : } } +void IfStatement0(final int start,final 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 after '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 +2032,39 @@ void ElseIfStatement() : } void WhileStatement() : -{} { - Condition("while") WhileStatement0() + final 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 +2085,103 @@ 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; + } + [ VariableSuffix() ] + 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() : +{ +final 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() ] [ StatementExpressionList() ] + ( + 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 after 'endfor' keyword"; + errorLevel = ERROR; + throw e; + } + ) } void ForInit() : @@ -1774,26 +2199,41 @@ void StatementExpressionList() : StatementExpression() ( StatementExpression() )* } -void ForUpdate() : -{} -{ - StatementExpressionList() -} - void BreakStatement() : {} { - [ ] + [ ] + try { + + } catch (ParseException e) { + errorMessage = "';' expected after 'break' statement"; + errorLevel = ERROR; + throw e; + } } void ContinueStatement() : {} { - [ ] + [ ] + try { + + } catch (ParseException e) { + errorMessage = "';' expected after 'continue' statement"; + errorLevel = ERROR; + throw e; + } } void ReturnStatement() : {} { - [ Expression() ] + [ Expression() ] + try { + + } catch (ParseException e) { + errorMessage = "';' expected after 'return' statement"; + errorLevel = ERROR; + throw e; + } } \ No newline at end of file