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 e3b05cf..bb3d533 100644 --- a/net.sourceforge.phpeclipse/src/test/PHPParser.jj +++ b/net.sourceforge.phpeclipse/src/test/PHPParser.jj @@ -30,6 +30,7 @@ import org.eclipse.jface.preference.IPreferenceStore; import java.util.Hashtable; import java.io.StringReader; +import java.io.*; import java.text.MessageFormat; import net.sourceforge.phpeclipse.actions.PHPStartApacheAction; @@ -50,6 +51,7 @@ import net.sourceforge.phpdt.internal.compiler.parser.PHPReqIncDeclaration; */ public final class PHPParser extends PHPParserSuperclass { + /** The file that is parsed. */ private static IFile fileToParse; /** The current segment */ @@ -58,24 +60,30 @@ public final 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$ PHPOutlineInfo outlineInfo; + + /** The error level of the current ParseException. */ private static int errorLevel = ERROR; + /** The message of the current ParseException. If it's null it's because the parse exception wasn't handled */ private static String errorMessage; + private static int errorStart = -1; + private static int errorEnd = -1; + public PHPParser() { } - public final 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 static final 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 +91,23 @@ public final class PHPParser extends PHPParserSuperclass { phpTest(); } - public static final void htmlParserTester(String strEval) throws CoreException, ParseException { - StringReader stream = new StringReader(strEval); + public static final void htmlParserTester(final File fileName) throws CoreException, ParseException { + try { + final Reader stream = new FileReader(fileName); + if (jj_input_stream == null) { + jj_input_stream = new SimpleCharStream(stream, 1, 1); + } + ReInit(stream); + phpFile(); + } catch (FileNotFoundException e) { + e.printStackTrace(); //To change body of catch statement use Options | File Templates. + } catch (ParseException e) { + e.printStackTrace(); //To change body of catch statement use Options | File Templates. + } + } + + 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 +115,10 @@ public final class PHPParser extends PHPParserSuperclass { phpFile(); } - public final 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); } @@ -117,6 +140,8 @@ public final class PHPParser extends PHPParserSuperclass { if (errorMessage == null) { PHPeclipsePlugin.log(e); errorMessage = "this exception wasn't handled by the parser please tell us how to reproduce it"; + errorStart = jj_input_stream.getPosition(); + errorEnd = errorStart + 1; } setMarker(e); errorMessage = null; @@ -124,15 +149,27 @@ public final 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, - "Line " + e.currentToken.beginLine); + if (errorStart == -1) { + setMarker(fileToParse, + errorMessage, + jj_input_stream.tokenBegin, + jj_input_stream.tokenBegin + e.currentToken.image.length(), + errorLevel, + "Line " + e.currentToken.beginLine); + } else { + setMarker(fileToParse, + errorMessage, + errorStart, + errorEnd, + errorLevel, + "Line " + e.currentToken.beginLine); + errorStart = -1; + errorEnd = -1; + } } catch (CoreException e2) { PHPeclipsePlugin.log(e2); } @@ -141,12 +178,12 @@ public final 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("<br />", indx)) != -1) { // newer php error output (tested with 4.2.3) @@ -163,7 +200,10 @@ public final 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; @@ -201,8 +241,8 @@ public final class PHPParser extends PHPParserSuperclass { } } - public final void parse(String s) throws CoreException { - StringReader stream = 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); } @@ -218,15 +258,15 @@ public final 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 @@ -245,7 +285,9 @@ PARSER_END(PHPParser) <DEFAULT> TOKEN : { - <PHPSTART : "<?php" | "<?"> : PHPPARSING + <PHPSTARTSHORT : "<?"> : PHPPARSING +| <PHPSTARTLONG : "<?php"> : PHPPARSING +| <PHPECHOSTART : "<?="> : PHPPARSING } <PHPPARSING> TOKEN : @@ -272,10 +314,12 @@ PARSER_END(PHPParser) /* COMMENTS */ -<PHPPARSING> MORE : +<PHPPARSING> SPECIAL_TOKEN : { "//" : IN_SINGLE_LINE_COMMENT | + "#" : IN_SINGLE_LINE_COMMENT +| <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT | "/*" : IN_MULTI_LINE_COMMENT @@ -286,7 +330,7 @@ PARSER_END(PHPParser) <SINGLE_LINE_COMMENT: "\n" | "\r" | "\r\n" > : PHPPARSING } -<IN_SINGLE_LINE_COMMENT> TOKEN : +<IN_SINGLE_LINE_COMMENT> SPECIAL_TOKEN : { <SINGLE_LINE_COMMENT_PHPEND : "?>" > : DEFAULT } @@ -319,72 +363,76 @@ MORE : | <ELSEIF : "elseif"> | <ELSE : "else"> | <ARRAY : "array"> +| <BREAK : "break"> } /* LANGUAGE CONSTRUCT */ <PHPPARSING> TOKEN : { - <PRINT : "print"> -| <ECHO : "echo"> -| <INCLUDE : "include"> -| <REQUIRE : "require"> -| <INCLUDE_ONCE : "include_once"> -| <REQUIRE_ONCE : "require_once"> -| <GLOBAL : "global"> -| <STATIC : "static"> -| <CLASSACCESS: "->"> -| <STATICCLASSACCESS: "::"> -| <ARRAYASSIGN: "=>"> + <PRINT : "print"> +| <ECHO : "echo"> +| <INCLUDE : "include"> +| <REQUIRE : "require"> +| <INCLUDE_ONCE : "include_once"> +| <REQUIRE_ONCE : "require_once"> +| <GLOBAL : "global"> +| <STATIC : "static"> +| <CLASSACCESS : "->"> +| <STATICCLASSACCESS : "::"> +| <ARRAYASSIGN : "=>"> } +<PHPPARSING> TOKEN : +{ + <LIST : "list"> +} /* RESERVED WORDS AND LITERALS */ <PHPPARSING> 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" > -| <ENDIF : "endif" > -| <ENDFOR : "endfor" > -| <FOREACH : "foreach" > -| <AS : "as" > + <CASE : "case"> +| <CONST : "const"> +| <CONTINUE : "continue"> +| <_DEFAULT : "default"> +| <DO : "do"> +| <EXTENDS : "extends"> +| <FOR : "for"> +| <GOTO : "goto"> +| <NEW : "new"> +| <NULL : "null"> +| <RETURN : "return"> +| <SUPER : "super"> +| <SWITCH : "switch"> +| <THIS : "this"> +| <TRUE : "true"> +| <FALSE : "false"> +| <WHILE : "while"> +| <ENDWHILE : "endwhile"> +| <ENDIF : "endif"> +| <ENDFOR : "endfor"> +| <FOREACH : "foreach"> +| <AS : "as" > } /* TYPES */ <PHPPARSING> TOKEN : { - <STRING : "string"> -| <OBJECT : "object"> -| <BOOL : "bool"> + <STRING : "string"> +| <OBJECT : "object"> +| <BOOL : "bool"> | <BOOLEAN : "boolean"> -| <REAL : "real"> -| <DOUBLE : "double"> -| <FLOAT : "float"> -| <INT : "int"> +| <REAL : "real"> +| <DOUBLE : "double"> +| <FLOAT : "float"> +| <INT : "int"> | <INTEGER : "integer"> } <PHPPARSING> TOKEN : { - < _ORL : "OR" > -| < _ANDL: "AND"> + <_ORL : "OR"> +| <_ANDL : "AND"> } /* LITERALS */ @@ -466,77 +514,79 @@ MORE : <PHPPARSING> TOKEN : { - < LPAREN: "(" > -| < RPAREN: ")" > -| < LBRACE: "{" > -| < RBRACE: "}" > -| < LBRACKET: "[" > -| < RBRACKET: "]" > -| < SEMICOLON: ";" > -| < COMMA: "," > -| < DOT: "." > + <LPAREN : "("> +| <RPAREN : ")"> +| <LBRACE : "{"> +| <RBRACE : "}"> +| <LBRACKET : "["> +| <RBRACKET : "]"> +| <SEMICOLON : ";"> +| <COMMA : ","> +| <DOT : "."> } -/* OPERATORS */ +/* COMPARATOR */ <PHPPARSING> TOKEN : { - <AT : "@"> -| <DOLLAR : "$"> -| <ASSIGN: "=" > -| <GT: ">" > -| <LT: "<" > -| <BANG: "!" > -| <HOOK: "?" > -| <COLON: ":" > -| <EQ: "==" > -| <LE: "<=" > -| <GE: ">=" > -| <NE: "!=" > -| <DIF: "<>" > -| <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: ">>=" > -| <BANGDOUBLEEQUAL: "!==" > -| <TRIPLEEQUAL: "===" > -| <TILDEEQUAL: "~=" > + <GT : ">"> +| <LT : "<"> +| <EQ : "=="> +| <LE : "<="> +| <GE : ">="> +| <NE : "!="> +| <DIF : "<>"> +| <BANGDOUBLEEQUAL : "!=="> +| <TRIPLEEQUAL : "==="> } +/* ASSIGNATION */ <PHPPARSING> TOKEN : { - < DOLLAR_ID: <DOLLAR> <IDENTIFIER> > + <ASSIGN : "="> +| <PLUSASSIGN : "+="> +| <MINUSASSIGN : "-="> +| <STARASSIGN : "*="> +| <SLASHASSIGN : "/="> +| <ANDASSIGN : "&="> +| <ORASSIGN : "|="> +| <XORASSIGN : "^="> +| <DOTASSIGN : ".="> +| <REMASSIGN : "%="> +| <TILDEEQUAL : "~="> } -/***************************************** - * THE JAVA LANGUAGE GRAMMAR STARTS HERE * - *****************************************/ +/* OPERATORS */ +<PHPPARSING> TOKEN : +{ + <AT : "@"> +| <DOLLAR : "$"> +| <BANG : "!"> +| <HOOK : "?"> +| <COLON : ":"> +| <SC_OR : "||"> +| <SC_AND : "&&"> +| <INCR : "++"> +| <DECR : "--"> +| <PLUS : "+"> +| <MINUS : "-"> +| <STAR : "*"> +| <SLASH : "/"> +| <BIT_AND : "&"> +| <BIT_OR : "|"> +| <XOR : "^"> +| <REM : "%"> +| <LSHIFT : "<<"> +| <RSIGNEDSHIFT : ">>"> +| <RUNSIGNEDSHIFT : ">>>"> +| <LSHIFTASSIGN : "<<="> +| <RSIGNEDSHIFTASSIGN : ">>="> +} -/* - * Program structuring syntax follows. - */ +<PHPPARSING> TOKEN : +{ + < DOLLAR_ID: <DOLLAR> <IDENTIFIER> > +} void phpTest() : {} @@ -549,21 +599,45 @@ void phpFile() : {} { try { - (<PHPSTART> Php() + (PhpBlock())* + <EOF> + } catch (TokenMgrError e) { + errorMessage = e.getMessage(); + errorLevel = ERROR; + throw generateParseException(); + } +} + +void PhpBlock() : +{ + final int start = jj_input_stream.getPosition(); +} +{ + <PHPECHOSTART> Expression() [ <SEMICOLON> ] <PHPEND> +| + [ <PHPSTARTLONG> + | <PHPSTARTSHORT> + {try { + setMarker(fileToParse, + "You should use '<?php' instead of '<?' it will avoid some problems with XML", + start, + jj_input_stream.getPosition(), + INFO, + "Line " + token.beginLine); + } catch (CoreException e) { + PHPeclipsePlugin.log(e); + }} + ] + Php() try { <PHPEND> } catch (ParseException e) { errorMessage = "'?>' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } - )* - <EOF> - } catch (TokenMgrError e) { - errorMessage = e.getMessage(); - errorLevel = ERROR; - throw generateParseException(); - } } void Php() : @@ -574,12 +648,34 @@ void Php() : void ClassDeclaration() : { - PHPClassDeclaration classDeclaration; - Token className; - final int pos = jj_input_stream.bufpos; + final PHPClassDeclaration classDeclaration; + final Token className; + final int pos; } { - <CLASS> className = <IDENTIFIER> [ <EXTENDS> <IDENTIFIER> ] + <CLASS> + try { + {pos = jj_input_stream.getPosition();} + className = <IDENTIFIER> + } catch (ParseException e) { + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', identifier expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } + [ + <EXTENDS> + try { + <IDENTIFIER> + } catch (ParseException e) { + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', identifier expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } + ] { if (currentSegment != null) { classDeclaration = new PHPClassDeclaration(currentSegment,className.image,pos); @@ -601,16 +697,20 @@ void ClassBody() : try { <LBRACE> } catch (ParseException e) { - errorMessage = "'{' expected"; + errorMessage = "unexpected token : '"+ e.currentToken.next.image + "', '{' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } ( ClassBodyDeclaration() )* try { <RBRACE> } catch (ParseException e) { - errorMessage = "'var', 'function' or '}' expected"; + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', 'var', 'function' or '}' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } } @@ -647,15 +747,17 @@ void FieldDeclaration() : } catch (ParseException e) { errorMessage = "';' expected after variable declaration"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } } PHPVarDeclaration VariableDeclarator() : { - String varName; - String varValue = null; - final int pos = jj_input_stream.bufpos; + final String varName; + final String varValue; + final int pos = jj_input_stream.getPosition(); } { varName = VariableDeclaratorId() @@ -663,18 +765,16 @@ PHPVarDeclaration VariableDeclarator() : <ASSIGN> try { varValue = VariableInitializer() + {return new PHPVarDeclaration(currentSegment,varName,pos,varValue);} } catch (ParseException e) { errorMessage = "Literal expression expected in variable initializer"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; 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() : @@ -693,6 +793,8 @@ String VariableDeclaratorId() : } catch (ParseException e) { errorMessage = "'$' expected for variable identifier"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } } @@ -700,7 +802,7 @@ String VariableDeclaratorId() : String Variable(): { String expr = null; - Token token; + final Token token; } { token = <DOLLAR_ID> [<LBRACE> expr = Expression() <RBRACE>] @@ -718,7 +820,7 @@ String Variable(): String VariableName(): { String expr = null; -Token token; +final Token token; } { <LBRACE> expr = Expression() <RBRACE> @@ -735,19 +837,22 @@ Token token; <DOLLAR> expr = VariableName() {return "$" + expr;} | + token = <DOLLAR_ID> + {return token.image + expr;} +/*| pas besoin ? token = <DOLLAR_ID> [expr = VariableName()] { if (expr == null) { return token.image; } return token.image + expr; - } + }*/ } String VariableInitializer() : { - String expr; - Token token; + final String expr; + final Token token; } { expr = Literal() @@ -781,7 +886,7 @@ final StringBuffer buff = new StringBuffer(); String ArrayInitializer() : { -String expr = null; +String expr; final StringBuffer buff = new StringBuffer("("); } { @@ -799,10 +904,22 @@ final StringBuffer buff = new StringBuffer("("); void MethodDeclaration() : { - PHPFunctionDeclaration functionDeclaration; + final PHPFunctionDeclaration functionDeclaration; } { - <FUNCTION> functionDeclaration = MethodDeclarator() + <FUNCTION> + try { + functionDeclaration = MethodDeclarator() + } catch (ParseException e) { + if (errorMessage != null) { + throw e; + } + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', function identifier expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } { if (currentSegment != null) { currentSegment.add(functionDeclaration); @@ -817,12 +934,16 @@ void MethodDeclaration() : } } +/** + * A MethodDeclarator contains [&] IDENTIFIER(parameters ...). + * @return a function description for the outline + */ PHPFunctionDeclaration MethodDeclarator() : { - Token identifier; - StringBuffer methodDeclaration = new StringBuffer(); - String formalParameters; - final int pos = jj_input_stream.bufpos; + final Token identifier; + final StringBuffer methodDeclaration = new StringBuffer(); + final String formalParameters; + final int pos = jj_input_stream.getPosition(); } { [ <BIT_AND> {methodDeclaration.append("&");} ] @@ -846,7 +967,9 @@ String FormalParameters() : } catch (ParseException e) { errorMessage = "Formal parameter expected after function identifier"; errorLevel = ERROR; - jj_consume_token(token.kind); + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; } [ expr = FormalParameter() {buff.append(expr);} @@ -860,6 +983,8 @@ String FormalParameters() : } catch (ParseException e) { errorMessage = "')' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } { @@ -870,7 +995,7 @@ String FormalParameters() : String FormalParameter() : { - PHPVarDeclaration variableDeclaration; + final PHPVarDeclaration variableDeclaration; final StringBuffer buff = new StringBuffer(); } { @@ -914,32 +1039,32 @@ String Type() : 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; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } ] - { - if (expr2 == null) { - return expr; - } else { - return expr + assignOperator + expr2; - } - } + {return expr;} } String AssignmentOperator() : @@ -975,7 +1100,7 @@ String AssignmentOperator() : String ConditionalExpression() : { - String expr; + final String expr; String expr2 = null; String expr3 = null; } @@ -994,19 +1119,16 @@ String ConditionalOrExpression() : { String expr; Token operator; - String expr2 = null; final StringBuffer buff = new StringBuffer(); } { expr = ConditionalAndExpression() - { - buff.append(expr); - } + {buff.append(expr);} ( - (operator = <SC_OR> | operator = <_ORL>) expr2 = ConditionalAndExpression() + (operator = <SC_OR> | operator = <_ORL>) expr = ConditionalAndExpression() { buff.append(operator.image); - buff.append(expr2); + buff.append(expr); } )* { @@ -1018,76 +1140,54 @@ String ConditionalAndExpression() : { String expr; Token operator; - String expr2 = null; final StringBuffer buff = new StringBuffer(); } { expr = ConcatExpression() - { - buff.append(expr); - } + {buff.append(expr);} ( - (operator = <SC_AND> | operator = <_ANDL>) expr2 = ConcatExpression() + (operator = <SC_AND> | 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; final StringBuffer buff = new StringBuffer(); } { expr = InclusiveOrExpression() - { - buff.append(expr); - } + {buff.append(expr);} ( - <DOT> expr2 = InclusiveOrExpression() - { - buff.append("."); - buff.append(expr2); - } + <DOT> expr = InclusiveOrExpression() + {buff.append(".").append(expr);} )* - { - return buff.toString(); - } + {return buff.toString();} } String InclusiveOrExpression() : { String expr; - String expr2 = null; final StringBuffer buff = new StringBuffer(); } { expr = ExclusiveOrExpression() - { - buff.append(expr); - } + {buff.append(expr);} ( - <BIT_OR> expr2 = ExclusiveOrExpression() - { - buff.append("|"); - buff.append(expr2); - } + <BIT_OR> expr = ExclusiveOrExpression() + {buff.append("|").append(expr);} )* - { - return buff.toString(); - } + {return buff.toString();} } String ExclusiveOrExpression() : { String expr; - String expr2 = null; final StringBuffer buff = new StringBuffer(); } { @@ -1096,10 +1196,10 @@ String ExclusiveOrExpression() : buff.append(expr); } ( - <XOR> expr2 = AndExpression() + <XOR> expr = AndExpression() { buff.append("^"); - buff.append(expr2); + buff.append(expr); } )* { @@ -1109,8 +1209,7 @@ String ExclusiveOrExpression() : String AndExpression() : { - final String expr; - String expr2 = null; + String expr; final StringBuffer buff = new StringBuffer(); } { @@ -1119,22 +1218,18 @@ String AndExpression() : buff.append(expr); } ( - <BIT_AND> expr2 = EqualityExpression() + <BIT_AND> 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; final StringBuffer buff = new StringBuffer(); } { @@ -1147,10 +1242,18 @@ String EqualityExpression() : | operator = <BANGDOUBLEEQUAL> | operator = <TRIPLEEQUAL> ) - expr2 = RelationalExpression() + try { + expr = RelationalExpression() + } catch (ParseException e) { + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', expression expected after '"+operator.image+"'"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } { buff.append(operator.image); - buff.append(expr2); + buff.append(expr); } )* {return buff.toString();} @@ -1160,18 +1263,14 @@ String RelationalExpression() : { String expr; Token operator; - String expr2; final StringBuffer buff = new StringBuffer(); } { expr = ShiftExpression() {buff.append(expr);} ( - ( operator = <LT> | operator = <GT> | operator = <LE> | operator = <GE> ) expr2 = ShiftExpression() - { - buff.append(operator.image); - buff.append(expr2); - } + ( operator = <LT> | operator = <GT> | operator = <LE> | operator = <GE> ) expr = ShiftExpression() + {buff.append(operator.image).append(expr);} )* {return buff.toString();} } @@ -1220,7 +1319,15 @@ String MultiplicativeExpression() : Token operator; final StringBuffer buff = new StringBuffer();} { - expr = UnaryExpression() + try { + expr = UnaryExpression() + } catch (ParseException e) { + errorMessage = "unexpected token '"+e.currentToken.next.image+"'"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } {buff.append(expr);} ( ( operator = <STAR> | operator = <SLASH> | operator = <REM> ) expr = UnaryExpression() @@ -1237,8 +1344,8 @@ String MultiplicativeExpression() : */ String UnaryExpression() : { - String expr; - Token token; + final String expr; + final Token token; final StringBuffer buff = new StringBuffer(); } { @@ -1256,8 +1363,8 @@ String UnaryExpression() : String UnaryExpressionNoPrefix() : { - String expr; - Token token; + final String expr; + final Token token; } { ( token = <PLUS> | token = <MINUS> ) expr = UnaryExpression() @@ -1278,7 +1385,7 @@ String UnaryExpressionNoPrefix() : String PreIncrementExpression() : { -String expr; +final String expr; } { <INCR> expr = PrimaryExpression() @@ -1287,7 +1394,7 @@ String expr; String PreDecrementExpression() : { -String expr; +final String expr; } { <DECR> expr = PrimaryExpression() @@ -1296,7 +1403,7 @@ String expr; String UnaryExpressionNotPlusMinus() : { - String expr; + final String expr; } { <BANG> expr = UnaryExpression() @@ -1312,7 +1419,16 @@ String UnaryExpressionNotPlusMinus() : expr = Literal() {return expr;} | - <LPAREN> expr = Expression()<RPAREN> + <LPAREN> expr = Expression() + try { + <RPAREN> + } catch (ParseException e) { + errorMessage = "')' expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } {return "("+expr+")";} } @@ -1327,7 +1443,7 @@ final String type, expr; String PostfixExpression() : { - String expr; + final String expr; Token operator = null; } { @@ -1342,7 +1458,7 @@ String PostfixExpression() : String PrimaryExpression() : { - Token identifier; + final Token identifier; String expr; final StringBuffer buff = new StringBuffer(); } @@ -1375,8 +1491,8 @@ String ArrayDeclarator() : String PrimaryPrefix() : { - String expr; - Token token = null; + final String expr; + final Token token; } { token = <IDENTIFIER> @@ -1386,15 +1502,30 @@ String PrimaryPrefix() : { return "new " + expr; } -| +| expr = VariableDeclaratorId() {return expr;} } -String ClassIdentifier(): +String classInstantiation() : { String expr; - Token token; + final StringBuffer buff = new StringBuffer("new "); +} +{ + <NEW> expr = ClassIdentifier() + {buff.append(expr);} + [ + expr = PrimaryExpression() + {buff.append(expr);} + ] + {return buff.toString();} +} + +String ClassIdentifier(): +{ + final String expr; + final Token token; } { token = <IDENTIFIER> @@ -1406,7 +1537,7 @@ String ClassIdentifier(): String PrimarySuffix() : { - String expr; + final String expr; } { expr = Arguments() @@ -1421,7 +1552,16 @@ String VariableSuffix() : String expr = null; } { - <CLASSACCESS> expr = VariableName() + <CLASSACCESS> + try { + expr = VariableName() + } catch (ParseException e) { + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', function call or field access expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } {return "->" + expr;} | <LBRACKET> [ expr = Expression() ] @@ -1430,6 +1570,8 @@ String VariableSuffix() : } catch (ParseException e) { errorMessage = "']' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } { @@ -1442,8 +1584,8 @@ String VariableSuffix() : String Literal() : { - String expr; - Token token; + final String expr; + final Token token; } { token = <INTEGER_LITERAL> @@ -1488,8 +1630,10 @@ String expr = null; try { <RPAREN> } 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; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } { @@ -1514,29 +1658,32 @@ final StringBuffer buff = new StringBuffer(); } catch (ParseException e) { errorMessage = "expression expected after a comma in argument list"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; 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 { - (<SEMICOLON> | "?>") + (<SEMICOLON> | <PHPEND> {PHPParserTokenManager.SwitchTo(PHPParserTokenManager.DEFAULT);}) } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } | @@ -1553,6 +1700,8 @@ void Statement() : } catch (ParseException e) { errorMessage = "';' expected after expression"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } | @@ -1568,8 +1717,6 @@ void Statement() : | ForeachStatement() | - BreakStatement() -| ContinueStatement() | ReturnStatement() @@ -1583,10 +1730,21 @@ void Statement() : GlobalStatement() } +/** + * A Normal statement + */ +void Statement() : +{} +{ + StatementNoBreak() +| + BreakStatement() +} + void IncludeStatement() : { - String expr; - final int pos = jj_input_stream.bufpos; + final String expr; + final int pos = jj_input_stream.getPosition(); } { <REQUIRE> @@ -1597,10 +1755,12 @@ void IncludeStatement() : } } try { - (<SEMICOLON> | "?>") + (<SEMICOLON> | <PHPEND> {PHPParserTokenManager.SwitchTo(PHPParserTokenManager.DEFAULT);}) } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } | @@ -1612,10 +1772,12 @@ void IncludeStatement() : } } try { - (<SEMICOLON> | "?>") + (<SEMICOLON> | <PHPEND> {PHPParserTokenManager.SwitchTo(PHPParserTokenManager.DEFAULT);}) } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } | @@ -1627,10 +1789,12 @@ void IncludeStatement() : } } try { - (<SEMICOLON> | "?>") + (<SEMICOLON> | <PHPEND> {PHPParserTokenManager.SwitchTo(PHPParserTokenManager.DEFAULT);}) } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } | @@ -1642,10 +1806,12 @@ void IncludeStatement() : } } try { - (<SEMICOLON> | "?>") + (<SEMICOLON> | <PHPEND> {PHPParserTokenManager.SwitchTo(PHPParserTokenManager.DEFAULT);}) } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } } @@ -1653,7 +1819,7 @@ void IncludeStatement() : String PrintExpression() : { final StringBuffer buff = new StringBuffer("print "); - String expr; + final String expr; } { <PRINT> expr = Expression() @@ -1663,15 +1829,64 @@ String PrintExpression() : } } +String ListExpression() : +{ + final StringBuffer buff = new StringBuffer("list("); + String expr; +} +{ + <LIST> + try { + <LPAREN> + } catch (ParseException e) { + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', '(' expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } + [ + expr = VariableDeclaratorId() + {buff.append(expr);} + ] + [ + try { + <COMMA> + } catch (ParseException e) { + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', ',' expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } + expr = VariableDeclaratorId() + {buff.append(",").append(expr);} + ] + {buff.append(")");} + try { + <RPAREN> + } catch (ParseException e) { + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', ')' expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } + [ <ASSIGN> expr = Expression() {buff.append("(").append(expr);}] + {return buff.toString();} +} + void EchoStatement() : {} { <ECHO> Expression() (<COMMA> Expression())* try { - (<SEMICOLON> | "?>") + (<SEMICOLON> | <PHPEND> {PHPParserTokenManager.SwitchTo(PHPParserTokenManager.DEFAULT);}) } catch (ParseException e) { errorMessage = "';' expected after 'echo' statement"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } } @@ -1681,10 +1896,12 @@ void GlobalStatement() : { <GLOBAL> VariableDeclaratorId() (<COMMA> VariableDeclaratorId())* try { - (<SEMICOLON> | "?>") + (<SEMICOLON> | <PHPEND> {PHPParserTokenManager.SwitchTo(PHPParserTokenManager.DEFAULT);}) } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } } @@ -1694,10 +1911,12 @@ void StaticStatement() : { <STATIC> VariableDeclarator() (<COMMA> VariableDeclarator())* try { - (<SEMICOLON> | "?>") + (<SEMICOLON> | <PHPEND> {PHPParserTokenManager.SwitchTo(PHPParserTokenManager.DEFAULT);}) } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } } @@ -1716,10 +1935,20 @@ void Block() : } catch (ParseException e) { errorMessage = "'{' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } ( BlockStatement() )* - <RBRACE> + try { + <RBRACE> + } catch (ParseException e) { + errorMessage = "unexpected token : '"+ e.currentToken.image +"', '}' expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } } void BlockStatement() : @@ -1732,10 +1961,29 @@ void BlockStatement() : MethodDeclaration() } +/** + * A Block statement that will not contain any 'break' + */ +void BlockStatementNoBreak() : +{} +{ + StatementNoBreak() +| + ClassDeclaration() +| + MethodDeclaration() +} + void LocalVariableDeclaration() : {} { - VariableDeclarator() ( <COMMA> VariableDeclarator() )* + LocalVariableDeclarator() ( <COMMA> LocalVariableDeclarator() )* +} + +void LocalVariableDeclarator() : +{} +{ + VariableDeclaratorId() [ <ASSIGN> Expression() ] } void EmptyStatement() : @@ -1762,36 +2010,137 @@ void StatementExpression() : } void SwitchStatement() : -{} { - <SWITCH> <LPAREN> Expression() <RPAREN> <LBRACE> - ( SwitchLabel() ( BlockStatement() )* )* - <RBRACE> + Token breakToken = null; + int line; +} +{ + <SWITCH> + try { + <LPAREN> + } catch (ParseException e) { + errorMessage = "'(' expected after 'switch'"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } + Expression() + try { + <RPAREN> + } catch (ParseException e) { + errorMessage = "')' expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } + try { + <LBRACE> + } catch (ParseException e) { + errorMessage = "'{' expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } + ( + line = SwitchLabel() + ( BlockStatementNoBreak() )* + [ breakToken = BreakStatement() ] + { + 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 { + <RBRACE> + } catch (ParseException e) { + errorMessage = "'}' expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } +} + +Token BreakStatement() : +{ + final Token token; +} +{ + token = <BREAK> [ Expression() ] + try { + <SEMICOLON> + } catch (ParseException e) { + errorMessage = "';' expected after 'break' keyword"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } + {return token;} } -void SwitchLabel() : -{} +int SwitchLabel() : { - <CASE> Expression() <COLON> + final Token token; +} +{ + token = <CASE> + try { + Expression() + } catch (ParseException e) { + if (errorMessage != null) throw e; + errorMessage = "expression expected after 'case' keyword"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } + try { + <COLON> + } catch (ParseException e) { + errorMessage = "':' expected after case expression"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } + {return token.beginLine;} | - <_DEFAULT> <COLON> + token = <_DEFAULT> + try { + <COLON> + } catch (ParseException e) { + errorMessage = "':' expected after 'default' keyword"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + 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. - */ { - Token token; - final int pos = jj_input_stream.bufpos; + final Token token; + final int pos = jj_input_stream.getPosition(); } { token = <IF> Condition("if") IfStatement0(pos,pos+token.image.length()) } -void Condition(String keyword) : +void Condition(final String keyword) : {} { try { @@ -1799,7 +2148,9 @@ void Condition(String keyword) : } catch (ParseException e) { errorMessage = "'(' expected after " + keyword + " keyword"; errorLevel = ERROR; - throw e; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length(); + errorEnd = errorStart +1; + processParseException(e); } Expression() try { @@ -1807,13 +2158,14 @@ void Condition(String keyword) : } catch (ParseException e) { errorMessage = "')' expected after " + keyword + " keyword"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } } -void IfStatement0(int start,int end) : -{ -} +void IfStatement0(final int start,final int end) : +{} { <COLON> (Statement())* (ElseIfStatementColon())* [ElseStatementColon()] @@ -1832,13 +2184,17 @@ void IfStatement0(int start,int end) : } catch (ParseException e) { errorMessage = "'endif' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } try { <SEMICOLON> } catch (ParseException e) { - errorMessage = "';' expected 'endif' keyword"; + errorMessage = "';' expected after 'endif' keyword"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } | @@ -1865,8 +2221,8 @@ void ElseIfStatement() : void WhileStatement() : { - Token token; - final int pos = jj_input_stream.bufpos; + final Token token; + final int pos = jj_input_stream.getPosition(); } { token = <WHILE> Condition("while") WhileStatement0(pos,pos + token.image.length()) @@ -1891,13 +2247,17 @@ void WhileStatement0(final int start, final int end) : } catch (ParseException e) { errorMessage = "'endwhile' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } try { - (<SEMICOLON> | "?>") + (<SEMICOLON> | <PHPEND> {PHPParserTokenManager.SwitchTo(PHPParserTokenManager.DEFAULT);}) } catch (ParseException e) { errorMessage = "';' expected after 'endwhile' keyword"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } | @@ -1909,10 +2269,12 @@ void DoStatement() : { <DO> Statement() <WHILE> Condition("while") try { - (<SEMICOLON> | "?>") + (<SEMICOLON> | <PHPEND> {PHPParserTokenManager.SwitchTo(PHPParserTokenManager.DEFAULT);}) } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } } @@ -1926,6 +2288,8 @@ void ForeachStatement() : } catch (ParseException e) { errorMessage = "'(' expected after 'foreach' keyword"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } try { @@ -1933,13 +2297,18 @@ void ForeachStatement() : } catch (ParseException e) { errorMessage = "variable expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } + [ VariableSuffix() ] try { <AS> } catch (ParseException e) { errorMessage = "'as' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } try { @@ -1947,6 +2316,8 @@ void ForeachStatement() : } catch (ParseException e) { errorMessage = "variable expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } [ <ARRAYASSIGN> Expression() ] @@ -1955,22 +2326,26 @@ void ForeachStatement() : } catch (ParseException e) { errorMessage = "')' expected after 'foreach' keyword"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } try { - Statement() + Statement() } catch (ParseException e) { if (errorMessage != null) throw e; errorMessage = "statement expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } } void ForStatement() : { -Token token; -final int pos = jj_input_stream.bufpos; +final Token token; +final int pos = jj_input_stream.getPosition(); } { token = <FOR> @@ -1979,9 +2354,11 @@ final int pos = jj_input_stream.bufpos; } catch (ParseException e) { errorMessage = "'(' expected after 'for' keyword"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } - [ ForInit() ] <SEMICOLON> [ Expression() ] <SEMICOLON> [ ForUpdate() ] <RPAREN> + [ ForInit() ] <SEMICOLON> [ Expression() ] <SEMICOLON> [ StatementExpressionList() ] <RPAREN> ( Statement() | @@ -2003,13 +2380,17 @@ final int pos = jj_input_stream.bufpos; } catch (ParseException e) { errorMessage = "'endfor' expected"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } try { <SEMICOLON> } catch (ParseException e) { - errorMessage = "';' expected 'endfor' keyword"; + errorMessage = "';' expected after 'endfor' keyword"; errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } ) @@ -2030,26 +2411,32 @@ void StatementExpressionList() : StatementExpression() ( <COMMA> StatementExpression() )* } -void ForUpdate() : -{} -{ - StatementExpressionList() -} - -void BreakStatement() : -{} -{ - <BREAK> [ <IDENTIFIER> ] <SEMICOLON> -} - void ContinueStatement() : {} { - <CONTINUE> [ <IDENTIFIER> ] <SEMICOLON> + <CONTINUE> [ <IDENTIFIER> ] + try { + <SEMICOLON> + } catch (ParseException e) { + errorMessage = "';' expected after 'continue' statement"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } } void ReturnStatement() : {} { - <RETURN> [ Expression() ] <SEMICOLON> + <RETURN> [ Expression() ] + try { + <SEMICOLON> + } catch (ParseException e) { + errorMessage = "';' expected after 'return' statement"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } } \ No newline at end of file