options { LOOKAHEAD = 1; CHOICE_AMBIGUITY_CHECK = 2; OTHER_AMBIGUITY_CHECK = 1; STATIC = true; DEBUG_PARSER = false; DEBUG_LOOKAHEAD = false; DEBUG_TOKEN_MANAGER = false; OPTIMIZE_TOKEN_MANAGER = false; ERROR_REPORTING = true; JAVA_UNICODE_ESCAPE = false; UNICODE_INPUT = false; IGNORE_CASE = true; USER_TOKEN_MANAGER = false; USER_CHAR_STREAM = false; BUILD_PARSER = true; BUILD_TOKEN_MANAGER = true; SANITY_CHECK = true; FORCE_LA_CHECK = false; } PARSER_BEGIN(PHPParser) package test; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; import org.eclipse.ui.texteditor.MarkerUtilities; import org.eclipse.jface.preference.IPreferenceStore; import java.util.Hashtable; import java.io.StringReader; import java.text.MessageFormat; import net.sourceforge.phpeclipse.actions.PHPStartApacheAction; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import net.sourceforge.phpdt.internal.compiler.parser.PHPOutlineInfo; import net.sourceforge.phpdt.internal.compiler.parser.PHPSegmentWithChildren; import net.sourceforge.phpdt.internal.compiler.parser.PHPFunctionDeclaration; import net.sourceforge.phpdt.internal.compiler.parser.PHPClassDeclaration; import net.sourceforge.phpdt.internal.compiler.parser.PHPVarDeclaration; import net.sourceforge.phpdt.internal.compiler.parser.PHPReqIncDeclaration; /** * A new php parser. * This php parser is inspired by the Java 1.2 grammar example * given with JavaCC. You can get JavaCC at http://www.webgain.com * You can test the parser with the PHPParserTestCase2.java * @author Matthieu Casanova */ public final class PHPParser extends PHPParserSuperclass { private static IFile fileToParse; /** The current segment */ private static PHPSegmentWithChildren currentSegment; 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; private static int errorLevel = ERROR; private static String errorMessage; public PHPParser() { } public final void setFileToParse(final IFile fileToParse) { this.fileToParse = fileToParse; } public PHPParser(final IFile fileToParse) { this(new StringReader("")); this.fileToParse = fileToParse; } public static final void phpParserTester(final String strEval) throws CoreException, ParseException { PHPParserTokenManager.SwitchTo(PHPParserTokenManager.PHPPARSING); final StringReader stream = new StringReader(strEval); if (jj_input_stream == null) { jj_input_stream = new SimpleCharStream(stream, 1, 1); } ReInit(new StringReader(strEval)); phpTest(); } 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); } ReInit(stream); phpFile(); } public final PHPOutlineInfo parseInfo(final Object parent, final String s) { outlineInfo = new PHPOutlineInfo(parent); currentSegment = outlineInfo.getDeclarations(); 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) { processParseException(e); } return outlineInfo; } /** * This method will process the parse exception. * If the error message is null, the parse exception wasn't catched and a trace is written in the log * @param e the ParseException */ private static void processParseException(final ParseException e) { if (errorMessage == null) { PHPeclipsePlugin.log(e); errorMessage = "this exception wasn't handled by the parser please tell us how to reproduce it"; } setMarker(e); errorMessage = null; } /** * Create marker for the parse error * @param e the ParseException */ 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); } catch (CoreException e2) { PHPeclipsePlugin.log(e2); } } /** * Create markers according to the external parser output */ 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; boolean flag = true; while ((brIndx = output.indexOf("
", indx)) != -1) { // newer php error output (tested with 4.2.3) scanLine(output, file, indx, brIndx); indx = brIndx + 6; flag = false; } if (flag) { while ((brIndx = output.indexOf("
", indx)) != -1) { // older php error output (tested with 4.2.3) scanLine(output, file, indx, brIndx); indx = brIndx + 4; } } } 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; current = output.substring(indx, brIndx); if (current.indexOf(PARSE_WARNING_STRING) != -1 || current.indexOf(PARSE_ERROR_STRING) != -1) { int onLine = current.indexOf("on line "); if (onLine != -1) { lineNumberBuffer.delete(0, lineNumberBuffer.length()); for (int i = onLine; i < current.length(); i++) { ch = current.charAt(i); if ('0' <= ch && '9' >= ch) { lineNumberBuffer.append(ch); } } int lineNumber = Integer.parseInt(lineNumberBuffer.toString()); Hashtable attributes = new Hashtable(); current = current.replaceAll("\n", ""); current = current.replaceAll("", ""); current = current.replaceAll("", ""); MarkerUtilities.setMessage(attributes, current); if (current.indexOf(PARSE_ERROR_STRING) != -1) attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR)); else if (current.indexOf(PARSE_WARNING_STRING) != -1) attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_WARNING)); else attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_INFO)); MarkerUtilities.setLineNumber(attributes, lineNumber); MarkerUtilities.createMarker(file, attributes, IMarker.PROBLEM); } } } 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) { processParseException(e); } } /** * Call the php parse command ( php -l -f <filename> ) * and create markers according to the external parser output */ public static void phpExternalParse(final IFile file) { final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore(); final String filename = file.getLocation().toString(); final String[] arguments = { filename }; final MessageFormat form = new MessageFormat(store.getString(PHPeclipsePlugin.EXTERNAL_PARSER_PREF)); final String command = form.format(arguments); final String parserResult = PHPStartApacheAction.getParserOutput(command, "External parser: "); try { // parse the buffer to find the errors and warnings createMarkers(parserResult, file); } catch (CoreException e) { PHPeclipsePlugin.log(e); } } public static final void parse() throws ParseException { phpFile(); } } PARSER_END(PHPParser) TOKEN : { : PHPPARSING | : PHPPARSING | "> : DEFAULT } SKIP : { < ~[] > } /* WHITE SPACE */ SKIP : { " " | "\t" | "\n" | "\r" | "\f" } /* COMMENTS */ SPECIAL_TOKEN : { "//" : IN_SINGLE_LINE_COMMENT | <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT | "/*" : IN_MULTI_LINE_COMMENT } SPECIAL_TOKEN : { : PHPPARSING } SPECIAL_TOKEN : { " > : DEFAULT } SPECIAL_TOKEN : { : PHPPARSING } SPECIAL_TOKEN : { : PHPPARSING } MORE : { < ~[] > } /* KEYWORDS */ TOKEN : { | | | | | | | } /* LANGUAGE CONSTRUCT */ TOKEN : { | | | | | | | | "> | | "> } TOKEN : { } /* RESERVED WORDS AND LITERALS */ TOKEN : { | | | <_DEFAULT : "default"> | | | | | | | | | | | | | | | | | | } /* TYPES */ TOKEN : { | | | | | | | | } TOKEN : { <_ORL : "OR"> | <_ANDL : "AND"> } /* LITERALS */ TOKEN : { < INTEGER_LITERAL: (["l","L"])? | (["l","L"])? | (["l","L"])? > | < #DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* > | < #HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ > | < #OCTAL_LITERAL: "0" (["0"-"7"])* > | < FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* ()? (["f","F","d","D"])? | "." (["0"-"9"])+ ()? (["f","F","d","D"])? | (["0"-"9"])+ (["f","F","d","D"])? | (["0"-"9"])+ ()? ["f","F","d","D"] > | < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ > | < STRING_LITERAL: ( | | )> | < STRING_1: "\"" ( ~["\""] | "\\\"" )* "\"" > | < STRING_2: "'" ( ~["'"] | "\\'" )* "'" > | < STRING_3: "`" ( ~["`"] | "\\`" )* "`" > } /* IDENTIFIERS */ TOKEN : { < IDENTIFIER: (|) (||)* > | < #LETTER: ["a"-"z"] | ["A"-"Z"] > | < #DIGIT: ["0"-"9"] > | < #SPECIAL: "_" | ["\u007f"-"\u00ff"] > } /* SEPARATORS */ TOKEN : { | | | | | | | | } /* COMPARATOR */ TOKEN : { "> | | | ="> | "> | | } /* ASSIGNATION */ TOKEN : { | | | | | | | | | | | | | | | | | | | >"> | >>"> | >="> } TOKEN : { < DOLLAR_ID: > } void phpTest() : {} { Php() } void phpFile() : {} { 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() : {} { (BlockStatement())* } void ClassDeclaration() : { final PHPClassDeclaration classDeclaration; final Token className; final int pos = jj_input_stream.bufpos; } { className = [ ] { if (currentSegment != null) { classDeclaration = new PHPClassDeclaration(currentSegment,className.image,pos); currentSegment.add(classDeclaration); currentSegment = classDeclaration; } } ClassBody() { if (currentSegment != null) { currentSegment = (PHPSegmentWithChildren) currentSegment.getParent(); } } } void ClassBody() : {} { try { } catch (ParseException e) { errorMessage = "'{' expected"; errorLevel = ERROR; throw e; } ( ClassBodyDeclaration() )* try { } catch (ParseException e) { errorMessage = "'var', 'function' or '}' expected"; errorLevel = ERROR; throw e; } } void ClassBodyDeclaration() : {} { MethodDeclaration() | FieldDeclaration() } void FieldDeclaration() : { PHPVarDeclaration variableDeclaration; } { variableDeclaration = VariableDeclarator() { if (currentSegment != null) { currentSegment.add(variableDeclaration); } } ( variableDeclaration = VariableDeclarator() { if (currentSegment != null) { currentSegment.add(variableDeclaration); } } )* try { } catch (ParseException e) { errorMessage = "';' expected after variable declaration"; errorLevel = ERROR; throw e; } } PHPVarDeclaration VariableDeclarator() : { final String varName; String varValue; final int pos = jj_input_stream.bufpos; } { varName = VariableDeclaratorId() [ try { varValue = VariableInitializer() {return new PHPVarDeclaration(currentSegment,varName,pos,varValue);} } catch (ParseException e) { errorMessage = "Literal expression expected in variable initializer"; errorLevel = ERROR; throw e; } ] {return new PHPVarDeclaration(currentSegment,varName,pos);} } String VariableDeclaratorId() : { String expr; final StringBuffer buff = new StringBuffer(); } { try { expr = Variable() {buff.append(expr);} ( LOOKAHEAD(2) expr = VariableSuffix() {buff.append(expr);} )* {return buff.toString();} } catch (ParseException e) { errorMessage = "'$' expected for variable identifier"; errorLevel = ERROR; throw e; } } String Variable(): { String expr = null; final Token token; } { token = [ expr = Expression() ] { if (expr == null) { return token.image; } return token + "{" + expr + "}"; } | expr = VariableName() {return "$" + expr;} } String VariableName(): { String expr = null; final Token token; } { expr = Expression() {return "{"+expr+"}";} | token = [ expr = Expression() ] { if (expr == null) { return token.image; } return token + "{" + expr + "}"; } | expr = VariableName() {return "$" + expr;} | token = [expr = VariableName()] { if (expr == null) { return token.image; } return token.image + expr; } } String VariableInitializer() : { 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; final StringBuffer buff = new StringBuffer(); } { expr = Expression() {buff.append(expr);} [ expr = Expression() {buff.append("=>").append(expr);}] {return buff.toString();} } String ArrayInitializer() : { String expr; final StringBuffer buff = new StringBuffer("("); } { [ expr = ArrayVariable() {buff.append(expr);} ( LOOKAHEAD(2) expr = ArrayVariable() {buff.append(",").append(expr);} )* ] { buff.append(")"); return buff.toString(); } } void MethodDeclaration() : { final PHPFunctionDeclaration functionDeclaration; } { functionDeclaration = MethodDeclarator() { if (currentSegment != null) { currentSegment.add(functionDeclaration); currentSegment = functionDeclaration; } } Block() { if (currentSegment != null) { currentSegment = (PHPSegmentWithChildren) currentSegment.getParent(); } } } PHPFunctionDeclaration MethodDeclarator() : { final Token identifier; final StringBuffer methodDeclaration = new StringBuffer(); final String formalParameters; final int pos = jj_input_stream.bufpos; } { [ {methodDeclaration.append("&");} ] identifier = {methodDeclaration.append(identifier);} formalParameters = FormalParameters() { methodDeclaration.append(formalParameters); return new PHPFunctionDeclaration(currentSegment,methodDeclaration.toString(),pos); } } String FormalParameters() : { String expr; final StringBuffer buff = new StringBuffer("("); } { try { } catch (ParseException e) { errorMessage = "Formal parameter expected after function identifier"; errorLevel = ERROR; jj_consume_token(token.kind); } [ expr = FormalParameter() {buff.append(expr);} ( expr = FormalParameter() {buff.append(",").append(expr);} )* ] try { } catch (ParseException e) { errorMessage = "')' expected"; errorLevel = ERROR; throw e; } { buff.append(")"); return buff.toString(); } } String FormalParameter() : { final PHPVarDeclaration variableDeclaration; final StringBuffer buff = new StringBuffer(); } { [ {buff.append("&");}] variableDeclaration = VariableDeclarator() { buff.append(variableDeclaration.toString()); return buff.toString(); } } String Type() : {} { {return "string";} | {return "bool";} | {return "boolean";} | {return "real";} | {return "double";} | {return "float";} | {return "int";} | {return "integer";} | {return "object";} } String Expression() : { 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 e; } ] {return expr;} } String AssignmentOperator() : {} { {return "=";} | {return "*=";} | {return "/=";} | {return "%=";} | {return "+=";} | {return "-=";} | {return "<<=";} | {return ">>=";} | {return "&=";} | {return "|=";} | {return "|=";} | {return ".=";} | {return "~=";} } String ConditionalExpression() : { final String expr; String expr2 = null; String expr3 = null; } { expr = ConditionalOrExpression() [ expr2 = Expression() expr3 = ConditionalExpression() ] { if (expr3 == null) { return expr; } else { return expr + "?" + expr2 + ":" + expr3; } } } String ConditionalOrExpression() : { String expr; Token operator; final StringBuffer buff = new StringBuffer(); } { expr = ConditionalAndExpression() {buff.append(expr);} ( (operator = | operator = <_ORL>) expr = ConditionalAndExpression() { buff.append(operator.image); buff.append(expr); } )* { return buff.toString(); } } String ConditionalAndExpression() : { String expr; Token operator; final StringBuffer buff = new StringBuffer(); } { expr = ConcatExpression() {buff.append(expr);} ( (operator = | operator = <_ANDL>) expr = ConcatExpression() { buff.append(operator.image); buff.append(expr); } )* {return buff.toString();} } String ConcatExpression() : { String expr; final StringBuffer buff = new StringBuffer(); } { expr = InclusiveOrExpression() {buff.append(expr);} ( expr = InclusiveOrExpression() {buff.append(".").append(expr);} )* {return buff.toString();} } String InclusiveOrExpression() : { String expr; final StringBuffer buff = new StringBuffer(); } { expr = ExclusiveOrExpression() {buff.append(expr);} ( expr = ExclusiveOrExpression() {buff.append("|").append(expr);} )* {return buff.toString();} } String ExclusiveOrExpression() : { String expr; final StringBuffer buff = new StringBuffer(); } { expr = AndExpression() { buff.append(expr); } ( expr = AndExpression() { buff.append("^"); buff.append(expr); } )* { return buff.toString(); } } String AndExpression() : { String expr; final StringBuffer buff = new StringBuffer(); } { expr = EqualityExpression() { buff.append(expr); } ( expr = EqualityExpression() { buff.append("&").append(expr); } )* {return buff.toString();} } String EqualityExpression() : { String expr; Token operator; final StringBuffer buff = new StringBuffer(); } { expr = RelationalExpression() {buff.append(expr);} ( ( operator = | operator = | operator = | operator = | operator = ) expr = RelationalExpression() { buff.append(operator.image); buff.append(expr); } )* {return buff.toString();} } String RelationalExpression() : { String expr; Token operator; final StringBuffer buff = new StringBuffer(); } { expr = ShiftExpression() {buff.append(expr);} ( ( operator = | operator = | operator = | operator = ) expr = ShiftExpression() {buff.append(operator.image).append(expr);} )* {return buff.toString();} } String ShiftExpression() : { String expr; Token operator; final StringBuffer buff = new StringBuffer(); } { expr = AdditiveExpression() {buff.append(expr);} ( (operator = | operator = | operator = ) expr = AdditiveExpression() { buff.append(operator.image); buff.append(expr); } )* {return buff.toString();} } String AdditiveExpression() : { String expr; Token operator; final StringBuffer buff = new StringBuffer(); } { expr = MultiplicativeExpression() {buff.append(expr);} ( ( operator = | operator = ) expr = MultiplicativeExpression() { buff.append(operator.image); buff.append(expr); } )* {return buff.toString();} } String MultiplicativeExpression() : { String expr; Token operator; final StringBuffer buff = new StringBuffer();} { expr = UnaryExpression() {buff.append(expr);} ( ( operator = | operator = | operator = ) expr = UnaryExpression() { buff.append(operator.image); buff.append(expr); } )* {return buff.toString();} } /** * An unary expression starting with @, & or nothing */ String UnaryExpression() : { final String expr; final Token token; final StringBuffer buff = new StringBuffer(); } { 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; } | expr = PreIncrementExpression() {return expr;} | expr = PreDecrementExpression() {return expr;} | expr = UnaryExpressionNotPlusMinus() {return expr;} } String PreIncrementExpression() : { final String expr; } { expr = PrimaryExpression() {return "++"+expr;} } String PreDecrementExpression() : { final String expr; } { expr = PrimaryExpression() {return "--"+expr;} } String UnaryExpressionNotPlusMinus() : { final String expr; } { expr = UnaryExpression() {return "!" + expr;} | LOOKAHEAD( Type() ) expr = CastExpression() {return expr;} | expr = PostfixExpression() {return expr;} | expr = Literal() {return expr;} | expr = Expression() try { } catch (ParseException e) { errorMessage = "')' expected"; errorLevel = ERROR; throw e; } {return "("+expr+")";} } String CastExpression() : { final String type, expr; } { type = Type() expr = UnaryExpression() {return "(" + type + ")" + expr;} } String PostfixExpression() : { final String expr; Token operator = null; } { expr = PrimaryExpression() [ operator = | operator = ] { if (operator == null) { return expr; } return expr + operator.image; } } String PrimaryExpression() : { final Token identifier; String expr; final StringBuffer buff = new StringBuffer(); } { LOOKAHEAD(2) identifier = expr = ClassIdentifier() {buff.append(identifier.image).append("::").append(expr);} ( expr = PrimarySuffix() {buff.append(expr);} )* {return buff.toString();} | expr = PrimaryPrefix() {buff.append(expr);} ( expr = PrimarySuffix() {buff.append(expr);} )* {return buff.toString();} | expr = ArrayDeclarator() {return "array" + expr;} } String ArrayDeclarator() : { final String expr; } { expr = ArrayInitializer() {return "array" + expr;} } String PrimaryPrefix() : { final String expr; final Token token; } { token = {return token.image;} | expr = ClassIdentifier() { return "new " + expr; } | expr = VariableDeclaratorId() {return expr;} } String ClassIdentifier(): { final String expr; final Token token; } { token = {return token.image;} | expr = VariableDeclaratorId() {return expr;} } String PrimarySuffix() : { final String expr; } { expr = Arguments() {return expr;} | expr = VariableSuffix() {return expr;} } String VariableSuffix() : { String expr = null; } { expr = VariableName() {return "->" + expr;} | [ expr = Expression() ] try { } catch (ParseException e) { errorMessage = "']' expected"; errorLevel = ERROR; throw e; } { if(expr == null) { return "[]"; } return "[" + expr + "]"; } } String Literal() : { final String expr; final Token token; } { token = {return token.image;} | token = {return token.image;} | token = {return token.image;} | expr = BooleanLiteral() {return expr;} | expr = NullLiteral() {return expr;} } String BooleanLiteral() : {} { {return "true";} | {return "false";} } String NullLiteral() : {} { {return "null";} } String Arguments() : { String expr = null; } { [ expr = ArgumentList() ] try { } catch (ParseException e) { errorMessage = "')' expected to close the argument list"; errorLevel = ERROR; throw e; } { if (expr == null) { return "()"; } return "(" + expr + ")"; } } String ArgumentList() : { String expr; final StringBuffer buff = new StringBuffer(); } { expr = Expression() {buff.append(expr);} ( try { expr = Expression() } catch (ParseException e) { errorMessage = "expression expected after a comma in argument list"; errorLevel = ERROR; throw e; } { buff.append(",").append(expr); } )* {return buff.toString();} } /* * Statement syntax follows. */ void StatementNoBreak() : {} { LOOKAHEAD(2) Expression() try { ( | ) } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; throw e; } | LOOKAHEAD(2) LabeledStatement() | Block() | EmptyStatement() | StatementExpression() try { } catch (ParseException e) { errorMessage = "';' expected after expression"; errorLevel = ERROR; throw e; } | SwitchStatement() | IfStatement() | WhileStatement() | DoStatement() | ForStatement() | ForeachStatement() | ContinueStatement() | ReturnStatement() | EchoStatement() | [] IncludeStatement() | StaticStatement() | GlobalStatement() } void Statement() : {} { StatementNoBreak() | BreakStatement() } void IncludeStatement() : { final String expr; final int pos = jj_input_stream.bufpos; } { expr = Expression() { if (currentSegment != null) { currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require",pos,expr)); } } try { ( | "?>") } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; throw e; } | expr = Expression() { if (currentSegment != null) { currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require_once",pos,expr)); } } try { ( | "?>") } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; throw e; } | expr = Expression() { if (currentSegment != null) { currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include",pos,expr)); } } try { ( | "?>") } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; throw e; } | expr = Expression() { if (currentSegment != null) { currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include_once",pos,expr)); } } try { ( | "?>") } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; throw e; } } String PrintExpression() : { final StringBuffer buff = new StringBuffer("print "); final String expr; } { expr = Expression() { buff.append(expr); return buff.toString(); } } String ListExpression() : { final StringBuffer buff = new StringBuffer("list("); String expr; } { [ expr = VariableDeclaratorId() {buff.append(expr);} ] {buff.append(",");} [ expr = VariableDeclaratorId() {buff.append(expr);} ] {buff.append(")");} [ expr = Expression() {buff.append("(").append(expr);}] {return buff.toString();} } void EchoStatement() : {} { Expression() ( Expression())* try { ( | "?>") } catch (ParseException e) { errorMessage = "';' expected after 'echo' statement"; errorLevel = ERROR; throw e; } } void GlobalStatement() : {} { VariableDeclaratorId() ( VariableDeclaratorId())* try { ( | "?>") } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; throw e; } } void StaticStatement() : {} { VariableDeclarator() ( VariableDeclarator())* try { ( | "?>") } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; throw e; } } void LabeledStatement() : {} { Statement() } void Block() : {} { try { } catch (ParseException e) { errorMessage = "'{' expected"; errorLevel = ERROR; throw e; } ( BlockStatement() )* try { } catch (ParseException e) { errorMessage = "unexpected token : "+ e.currentToken.image +", '}' expected"; errorLevel = ERROR; throw e; } } void BlockStatement() : {} { Statement() | ClassDeclaration() | MethodDeclaration() } void BlockStatementNoBreak() : {} { StatementNoBreak() | ClassDeclaration() | MethodDeclaration() } void LocalVariableDeclaration() : {} { LocalVariableDeclarator() ( LocalVariableDeclarator() )* } void LocalVariableDeclarator() : {} { VariableDeclaratorId() [ Expression() ] } void EmptyStatement() : {} { } void StatementExpression() : {} { PreIncrementExpression() | PreDecrementExpression() | PrimaryExpression() [ | | AssignmentOperator() Expression() ] } void SwitchStatement() : { 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; } } int SwitchLabel() : { 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;} | token = <_DEFAULT> try { } catch (ParseException e) { errorMessage = "':' expected after 'default' keyword"; errorLevel = ERROR; throw e; } {return token.beginLine;} } void IfStatement() : { final Token token; final int pos = jj_input_stream.bufpos; } { token = Condition("if") IfStatement0(pos,pos+token.image.length()) } void Condition(final String keyword) : {} { try { } catch (ParseException e) { errorMessage = "'(' expected after " + keyword + " keyword"; errorLevel = ERROR; throw e; } Expression() try { } catch (ParseException e) { errorMessage = "')' expected after " + keyword + " keyword"; errorLevel = ERROR; throw e; } } 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() : {} { Condition("elseif") Statement() } void WhileStatement() : { final Token token; final int pos = jj_input_stream.bufpos; } { token = Condition("while") WhileStatement0(pos,pos + token.image.length()) } void WhileStatement0(final int start, final int end) : {} { (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 after 'endwhile' keyword"; errorLevel = ERROR; throw e; } | Statement() } void DoStatement() : {} { Statement() Condition("while") try { ( | "?>") } catch (ParseException e) { errorMessage = "';' expected"; errorLevel = ERROR; throw e; } } void ForeachStatement() : {} { 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() : {} { LOOKAHEAD(LocalVariableDeclaration()) LocalVariableDeclaration() | StatementExpressionList() } void StatementExpressionList() : {} { StatementExpression() ( StatementExpression() )* } 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() ] try { } catch (ParseException e) { errorMessage = "';' expected after 'return' statement"; errorLevel = ERROR; throw e; } }