X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/test/PHPParser.java b/net.sourceforge.phpeclipse/src/test/PHPParser.java index 931b4b3..bc7c112 100644 --- a/net.sourceforge.phpeclipse/src/test/PHPParser.java +++ b/net.sourceforge.phpeclipse/src/test/PHPParser.java @@ -8,22 +8,19 @@ import org.eclipse.ui.texteditor.MarkerUtilities; import org.eclipse.jface.preference.IPreferenceStore; import java.util.Hashtable; +import java.util.Enumeration; import java.io.StringReader; import java.io.*; 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; +import net.sourceforge.phpdt.internal.compiler.parser.*; +import net.sourceforge.phpdt.internal.compiler.ast.*; /** * A new php parser. - * This php parser is inspired by the Java 1.2 grammar example + * 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 @@ -33,12 +30,15 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon /** The file that is parsed. */ private static IFile fileToParse; - /** The current segment */ + /** 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; + static PHPOutlineInfo outlineInfo; + + private static PHPFunctionDeclaration currentFunction; + private static boolean assigning; /** The error level of the current ParseException. */ private static int errorLevel = ERROR; @@ -48,13 +48,20 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon private static int errorStart = -1; private static int errorEnd = -1; - public PHPParser() { - } + //ast stack + private final static int AstStackIncrement = 100; + /** The stack of node. */ + private static AstNode[] astStack; + /** The cursor in expression stack. */ + private static int expressionPtr; public final void setFileToParse(final IFile fileToParse) { this.fileToParse = fileToParse; } + public PHPParser() { + } + public PHPParser(final IFile fileToParse) { this(new StringReader("")); this.fileToParse = fileToParse; @@ -67,6 +74,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon jj_input_stream = new SimpleCharStream(stream, 1, 1); } ReInit(new StringReader(strEval)); + astStack = new AstNode[AstStackIncrement]; phpTest(); } @@ -77,11 +85,10 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon jj_input_stream = new SimpleCharStream(stream, 1, 1); } ReInit(stream); + astStack = new AstNode[AstStackIncrement]; 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. } } @@ -91,6 +98,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon jj_input_stream = new SimpleCharStream(stream, 1, 1); } ReInit(stream); + astStack = new AstNode[AstStackIncrement]; phpFile(); } @@ -102,6 +110,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon jj_input_stream = new SimpleCharStream(stream, 1, 1); } ReInit(stream); + astStack = new AstNode[AstStackIncrement]; try { parse(); } catch (ParseException e) { @@ -226,6 +235,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon jj_input_stream = new SimpleCharStream(stream, 1, 1); } ReInit(stream); + astStack = new AstNode[AstStackIncrement]; try { parse(); } catch (ParseException e) { @@ -255,7 +265,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon } } - public static final void parse() throws ParseException { + private static final void parse() throws ParseException { phpFile(); } @@ -278,6 +288,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon case IF: case ARRAY: case BREAK: + case LIST: case PRINT: case ECHO: case INCLUDE: @@ -286,7 +297,6 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon case REQUIRE_ONCE: case GLOBAL: case STATIC: - case LIST: case CONTINUE: case DO: case FOR: @@ -324,27 +334,25 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon } jj_consume_token(0); } catch (TokenMgrError e) { + PHPeclipsePlugin.log(e); + errorStart = SimpleCharStream.getPosition(); + errorEnd = errorStart + 1; errorMessage = e.getMessage(); errorLevel = ERROR; {if (true) throw generateParseException();} } } +/** + * A php block is a + * or + * or + */ static final public void PhpBlock() throws ParseException { final int start = jj_input_stream.getPosition(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PHPECHOSTART: - jj_consume_token(PHPECHOSTART); - Expression(); - switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { - case SEMICOLON: - jj_consume_token(SEMICOLON); - break; - default: - jj_la1[1] = jj_gen; - ; - } - jj_consume_token(PHPEND); + phpEchoBlock(); break; case PHPSTARTSHORT: case PHPSTARTLONG: @@ -354,6 +362,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon case IF: case ARRAY: case BREAK: + case LIST: case PRINT: case ECHO: case INCLUDE: @@ -362,7 +371,6 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon case REQUIRE_ONCE: case GLOBAL: case STATIC: - case LIST: case CONTINUE: case DO: case FOR: @@ -411,13 +419,13 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon } break; default: - jj_la1[2] = jj_gen; + jj_la1[1] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; default: - jj_la1[3] = jj_gen; + jj_la1[2] = jj_gen; ; } Php(); @@ -432,12 +440,26 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon } break; default: - jj_la1[4] = jj_gen; + jj_la1[3] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } + static final public void phpEchoBlock() throws ParseException { + jj_consume_token(PHPECHOSTART); + Expression(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case SEMICOLON: + jj_consume_token(SEMICOLON); + break; + default: + jj_la1[4] = jj_gen; + ; + } + jj_consume_token(PHPEND); + } + static final public void Php() throws ParseException { label_2: while (true) { @@ -447,6 +469,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon case IF: case ARRAY: case BREAK: + case LIST: case PRINT: case ECHO: case INCLUDE: @@ -455,7 +478,6 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon case REQUIRE_ONCE: case GLOBAL: case STATIC: - case LIST: case CONTINUE: case DO: case FOR: @@ -504,8 +526,8 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon } 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; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; {if (true) throw e;} } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -570,6 +592,9 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon } } +/** + * A class can contain only methods and fields. + */ static final public void ClassBodyDeclaration() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case FUNCTION: @@ -585,10 +610,14 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon } } +/** + * A class field declaration : it's var VariableDeclarator() (, VariableDeclarator())*;. + */ static final public void FieldDeclaration() throws ParseException { PHPVarDeclaration variableDeclaration; jj_consume_token(VAR); variableDeclaration = VariableDeclarator(); + outlineInfo.addVariable(variableDeclaration.getVariable().getName()); if (currentSegment != null) { currentSegment.add(variableDeclaration); } @@ -611,7 +640,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon try { jj_consume_token(SEMICOLON); } catch (ParseException e) { - errorMessage = "';' expected after variable declaration"; + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected after variable declaration"; errorLevel = ERROR; errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; errorEnd = jj_input_stream.getPosition() + 1; @@ -620,8 +649,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon } static final public PHPVarDeclaration VariableDeclarator() throws ParseException { - final String varName; - final String varValue; + final String varName, varValue; final int pos = jj_input_stream.getPosition(); varName = VariableDeclaratorId(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -651,7 +679,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon final StringBuffer buff = new StringBuffer(); try { expr = Variable(); - buff.append(expr); + buff.append(expr); label_5: while (true) { if (jj_2_1(2)) { @@ -660,7 +688,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon break label_5; } expr = VariableSuffix(); - buff.append(expr); + buff.append(expr); } {if (true) return buff.toString();} } catch (ParseException e) { @@ -689,15 +717,21 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon jj_la1[11] = jj_gen; ; } - if (expr == null) { - {if (true) return token.image;} + if (expr == null && !assigning) { + if (currentFunction != null) { + PHPVarDeclaration var = currentFunction.getParameter(token.image.substring(1)); + if (var != null) { + var.getVariable().setUsed(true); + } + } + {if (true) return token.image.substring(1);} } {if (true) return token + "{" + expr + "}";} break; case DOLLAR: jj_consume_token(DOLLAR); expr = VariableName(); - {if (true) return "$" + expr;} + {if (true) return expr;} break; default: jj_la1[12] = jj_gen; @@ -730,6 +764,12 @@ final Token token; ; } if (expr == null) { + if (currentFunction != null) { + PHPVarDeclaration var = currentFunction.getParameter(token.image); + if (var != null) { + var.getVariable().setUsed(true); + } + } {if (true) return token.image;} } {if (true) return token + "{" + expr + "}";} @@ -737,11 +777,23 @@ final Token token; case DOLLAR: jj_consume_token(DOLLAR); expr = VariableName(); - {if (true) return "$" + expr;} + if (currentFunction != null) { + PHPVarDeclaration var = currentFunction.getParameter(expr); + if (var != null) { + var.getVariable().setUsed(true); + } + } + {if (true) return "$" + expr;} break; case DOLLAR_ID: token = jj_consume_token(DOLLAR_ID); - {if (true) return token.image + expr;} + if (currentFunction != null) { + PHPVarDeclaration var = currentFunction.getParameter(token.image.substring(1)); + if (var != null) { + var.getVariable().setUsed(true); + } + } + {if (true) return token.image + expr;} break; default: jj_la1[14] = jj_gen; @@ -837,8 +889,8 @@ final StringBuffer buff = new StringBuffer("("); jj_consume_token(LPAREN); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ARRAY: - case PRINT: case LIST: + case PRINT: case NEW: case NULL: case TRUE: @@ -875,17 +927,32 @@ final StringBuffer buff = new StringBuffer("("); jj_la1[19] = jj_gen; ; } + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case COMMA: + jj_consume_token(COMMA); + buff.append(","); + break; + default: + jj_la1[20] = jj_gen; + ; + } jj_consume_token(RPAREN); buff.append(")"); {if (true) return buff.toString();} throw new Error("Missing return statement in function"); } +/** + * A Method Declaration. + * function MetodDeclarator() Block() + */ static final public void MethodDeclaration() throws ParseException { final PHPFunctionDeclaration functionDeclaration; - jj_consume_token(FUNCTION); + Token functionToken; + functionToken = jj_consume_token(FUNCTION); try { functionDeclaration = MethodDeclarator(); + outlineInfo.addVariable(functionDeclaration.getName()); } catch (ParseException e) { if (errorMessage != null) { {if (true) throw e;} @@ -900,20 +967,39 @@ final StringBuffer buff = new StringBuffer("("); currentSegment.add(functionDeclaration); currentSegment = functionDeclaration; } + currentFunction = functionDeclaration; Block(); + Hashtable parameters = currentFunction.getParameters(); + Enumeration vars = parameters.elements(); + while (vars.hasMoreElements()) { + PHPVarDeclaration o = (PHPVarDeclaration) vars.nextElement(); + if (!o.getVariable().isUsed()) { + try { + setMarker(fileToParse, + "Parameter "+o.getVariable().getName()+" is never used in function", + functionToken.beginLine, + WARNING, + "Line " + token.beginLine); + } catch (CoreException e) { + PHPeclipsePlugin.log(e); + } + } + } + currentFunction = null; if (currentSegment != null) { currentSegment = (PHPSegmentWithChildren) currentSegment.getParent(); } } /** - * A MethodDeclarator contains [&] IDENTIFIER(parameters ...). + * A MethodDeclarator. + * [&] IDENTIFIER(parameters ...). * @return a function description for the outline */ static final public PHPFunctionDeclaration MethodDeclarator() throws ParseException { final Token identifier; final StringBuffer methodDeclaration = new StringBuffer(); - final String formalParameters; + final Hashtable formalParameters; final int pos = jj_input_stream.getPosition(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case BIT_AND: @@ -921,24 +1007,29 @@ final StringBuffer buff = new StringBuffer("("); methodDeclaration.append("&"); break; default: - jj_la1[20] = jj_gen; + jj_la1[21] = jj_gen; ; } identifier = jj_consume_token(IDENTIFIER); - methodDeclaration.append(identifier); formalParameters = FormalParameters(); - methodDeclaration.append(formalParameters); - {if (true) return new PHPFunctionDeclaration(currentSegment,methodDeclaration.toString(),pos);} + methodDeclaration.append(identifier); + {if (true) return new PHPFunctionDeclaration(currentSegment,methodDeclaration.toString(),pos,formalParameters);} throw new Error("Missing return statement in function"); } - static final public String FormalParameters() throws ParseException { +/** + * FormalParameters follows method identifier. + * (FormalParameter()) + */ + static final public Hashtable FormalParameters() throws ParseException { String expr; final StringBuffer buff = new StringBuffer("("); + PHPVarDeclaration var; + final Hashtable parameters = new Hashtable(); try { jj_consume_token(LPAREN); } catch (ParseException e) { - errorMessage = "Formal parameter expected after function identifier"; + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', '(' expected after function identifier"; errorLevel = ERROR; errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; errorEnd = jj_input_stream.getPosition() + 1; @@ -948,8 +1039,8 @@ final StringBuffer buff = new StringBuffer("("); case DOLLAR: case BIT_AND: case DOLLAR_ID: - expr = FormalParameter(); - buff.append(expr); + var = FormalParameter(); + parameters.put(var.getVariable().getName(),var); label_7: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -957,16 +1048,16 @@ final StringBuffer buff = new StringBuffer("("); ; break; default: - jj_la1[21] = jj_gen; + jj_la1[22] = jj_gen; break label_7; } jj_consume_token(COMMA); - expr = FormalParameter(); - buff.append(",").append(expr); + var = FormalParameter(); + parameters.put(var.getVariable().getName(),var); } break; default: - jj_la1[22] = jj_gen; + jj_la1[23] = jj_gen; ; } try { @@ -978,26 +1069,30 @@ final StringBuffer buff = new StringBuffer("("); errorEnd = jj_input_stream.getPosition() + 1; {if (true) throw e;} } - buff.append(")"); - {if (true) return buff.toString();} + {if (true) return parameters;} throw new Error("Missing return statement in function"); } - static final public String FormalParameter() throws ParseException { +/** + * A formal parameter. + * $varname[=value] (,$varname[=value]) + */ + static final public PHPVarDeclaration FormalParameter() throws ParseException { final PHPVarDeclaration variableDeclaration; - final StringBuffer buff = new StringBuffer(); + Token token = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case BIT_AND: - jj_consume_token(BIT_AND); - buff.append("&"); + token = jj_consume_token(BIT_AND); break; default: - jj_la1[23] = jj_gen; + jj_la1[24] = jj_gen; ; } variableDeclaration = VariableDeclarator(); - buff.append(variableDeclaration.toString()); - {if (true) return buff.toString();} + if (token != null) { + variableDeclaration.getVariable().setReference(true); + } + {if (true) return variableDeclaration;} throw new Error("Missing return statement in function"); } @@ -1005,42 +1100,42 @@ final StringBuffer buff = new StringBuffer("("); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STRING: jj_consume_token(STRING); - {if (true) return "string";} + {if (true) return "string";} break; case BOOL: jj_consume_token(BOOL); - {if (true) return "bool";} + {if (true) return "bool";} break; case BOOLEAN: jj_consume_token(BOOLEAN); - {if (true) return "boolean";} + {if (true) return "boolean";} break; case REAL: jj_consume_token(REAL); - {if (true) return "real";} + {if (true) return "real";} break; case DOUBLE: jj_consume_token(DOUBLE); - {if (true) return "double";} + {if (true) return "double";} break; case FLOAT: jj_consume_token(FLOAT); - {if (true) return "float";} + {if (true) return "float";} break; case INT: jj_consume_token(INT); - {if (true) return "int";} + {if (true) return "int";} break; case INTEGER: jj_consume_token(INTEGER); - {if (true) return "integer";} + {if (true) return "integer";} break; case OBJECT: jj_consume_token(OBJECT); - {if (true) return "object";} + {if (true) return "object";} break; default: - jj_la1[24] = jj_gen; + jj_la1[25] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1054,69 +1149,74 @@ final StringBuffer buff = new StringBuffer("("); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PRINT: expr = PrintExpression(); - {if (true) return expr;} + {if (true) return expr;} break; case LIST: expr = ListExpression(); - {if (true) return expr;} + {if (true) return expr;} break; - case ARRAY: - case NEW: - case NULL: - case TRUE: - case FALSE: - case INTEGER_LITERAL: - case FLOATING_POINT_LITERAL: - case STRING_LITERAL: - case IDENTIFIER: - case LPAREN: - case AT: - case DOLLAR: - case BANG: - case INCR: - case DECR: - case PLUS: - case MINUS: - case BIT_AND: - case DOLLAR_ID: - expr = ConditionalExpression(); - switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { - case ASSIGN: - case PLUSASSIGN: - case MINUSASSIGN: - case STARASSIGN: - case SLASHASSIGN: - case ANDASSIGN: - case ORASSIGN: - case XORASSIGN: - case DOTASSIGN: - case REMASSIGN: - case TILDEEQUAL: - case LSHIFTASSIGN: - case RSIGNEDSHIFTASSIGN: - assignOperator = AssignmentOperator(); - try { - expr2 = Expression(); - {if (true) return expr + assignOperator + expr2;} - } catch (ParseException e) { + default: + jj_la1[26] = jj_gen; + if (jj_2_3(2147483647)) { + expr = varAssignation(); + {if (true) return expr;} + } else { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case ARRAY: + case NEW: + case NULL: + case TRUE: + case FALSE: + case INTEGER_LITERAL: + case FLOATING_POINT_LITERAL: + case STRING_LITERAL: + case IDENTIFIER: + case LPAREN: + case AT: + case DOLLAR: + case BANG: + case INCR: + case DECR: + case PLUS: + case MINUS: + case BIT_AND: + case DOLLAR_ID: + expr = ConditionalExpression(); + {if (true) return expr;} + break; + default: + jj_la1[27] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + } + throw new Error("Missing return statement in function"); + } + +/** + * A Variable assignation. + * varName (an assign operator) any expression + */ + static final public String varAssignation() throws ParseException { + String varName,assignOperator,expr2; + PHPVarDeclaration variable; + final int pos = SimpleCharStream.getPosition(); + varName = VariableDeclaratorId(); + assignOperator = AssignmentOperator(); + try { + expr2 = Expression(); + } catch (ParseException e) { + if (errorMessage != null) { + {if (true) throw e;} + } errorMessage = "expression expected"; errorLevel = ERROR; errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; errorEnd = jj_input_stream.getPosition() + 1; {if (true) throw e;} - } - break; - default: - jj_la1[25] = jj_gen; - ; - } - {if (true) return expr;} - break; - default: - jj_la1[26] = jj_gen; - jj_consume_token(-1); - throw new ParseException(); } + {if (true) return varName + assignOperator + expr2;} throw new Error("Missing return statement in function"); } @@ -1124,58 +1224,58 @@ final StringBuffer buff = new StringBuffer("("); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ASSIGN: jj_consume_token(ASSIGN); - {if (true) return "=";} + {if (true) return "=";} break; case STARASSIGN: jj_consume_token(STARASSIGN); - {if (true) return "*=";} + {if (true) return "*=";} break; case SLASHASSIGN: jj_consume_token(SLASHASSIGN); - {if (true) return "/=";} + {if (true) return "/=";} break; case REMASSIGN: jj_consume_token(REMASSIGN); - {if (true) return "%=";} + {if (true) return "%=";} break; case PLUSASSIGN: jj_consume_token(PLUSASSIGN); - {if (true) return "+=";} + {if (true) return "+=";} break; case MINUSASSIGN: jj_consume_token(MINUSASSIGN); - {if (true) return "-=";} + {if (true) return "-=";} break; case LSHIFTASSIGN: jj_consume_token(LSHIFTASSIGN); - {if (true) return "<<=";} + {if (true) return "<<=";} break; case RSIGNEDSHIFTASSIGN: jj_consume_token(RSIGNEDSHIFTASSIGN); - {if (true) return ">>=";} + {if (true) return ">>=";} break; case ANDASSIGN: jj_consume_token(ANDASSIGN); - {if (true) return "&=";} + {if (true) return "&=";} break; case XORASSIGN: jj_consume_token(XORASSIGN); - {if (true) return "|=";} + {if (true) return "|=";} break; case ORASSIGN: jj_consume_token(ORASSIGN); - {if (true) return "|=";} + {if (true) return "|=";} break; case DOTASSIGN: jj_consume_token(DOTASSIGN); - {if (true) return ".=";} + {if (true) return ".=";} break; case TILDEEQUAL: jj_consume_token(TILDEEQUAL); - {if (true) return "~=";} + {if (true) return "~=";} break; default: - jj_la1[27] = jj_gen; + jj_la1[28] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1195,7 +1295,7 @@ final StringBuffer buff = new StringBuffer("("); expr3 = ConditionalExpression(); break; default: - jj_la1[28] = jj_gen; + jj_la1[29] = jj_gen; ; } if (expr3 == null) { @@ -1220,7 +1320,7 @@ final StringBuffer buff = new StringBuffer("("); ; break; default: - jj_la1[29] = jj_gen; + jj_la1[30] = jj_gen; break label_8; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -1231,7 +1331,7 @@ final StringBuffer buff = new StringBuffer("("); operator = jj_consume_token(_ORL); break; default: - jj_la1[30] = jj_gen; + jj_la1[31] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1257,7 +1357,7 @@ final StringBuffer buff = new StringBuffer("("); ; break; default: - jj_la1[31] = jj_gen; + jj_la1[32] = jj_gen; break label_9; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -1268,7 +1368,7 @@ final StringBuffer buff = new StringBuffer("("); operator = jj_consume_token(_ANDL); break; default: - jj_la1[32] = jj_gen; + jj_la1[33] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1292,7 +1392,7 @@ final StringBuffer buff = new StringBuffer("("); ; break; default: - jj_la1[33] = jj_gen; + jj_la1[34] = jj_gen; break label_10; } jj_consume_token(DOT); @@ -1315,7 +1415,7 @@ final StringBuffer buff = new StringBuffer("("); ; break; default: - jj_la1[34] = jj_gen; + jj_la1[35] = jj_gen; break label_11; } jj_consume_token(BIT_OR); @@ -1338,7 +1438,7 @@ final StringBuffer buff = new StringBuffer("("); ; break; default: - jj_la1[35] = jj_gen; + jj_la1[36] = jj_gen; break label_12; } jj_consume_token(XOR); @@ -1362,7 +1462,7 @@ final StringBuffer buff = new StringBuffer("("); ; break; default: - jj_la1[36] = jj_gen; + jj_la1[37] = jj_gen; break label_13; } jj_consume_token(BIT_AND); @@ -1390,7 +1490,7 @@ final StringBuffer buff = new StringBuffer("("); ; break; default: - jj_la1[37] = jj_gen; + jj_la1[38] = jj_gen; break label_14; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -1410,7 +1510,7 @@ final StringBuffer buff = new StringBuffer("("); operator = jj_consume_token(TRIPLEEQUAL); break; default: - jj_la1[38] = jj_gen; + jj_la1[39] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1446,7 +1546,7 @@ final StringBuffer buff = new StringBuffer("("); ; break; default: - jj_la1[39] = jj_gen; + jj_la1[40] = jj_gen; break label_15; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -1463,7 +1563,7 @@ final StringBuffer buff = new StringBuffer("("); operator = jj_consume_token(GE); break; default: - jj_la1[40] = jj_gen; + jj_la1[41] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1489,7 +1589,7 @@ final StringBuffer buff = new StringBuffer("("); ; break; default: - jj_la1[41] = jj_gen; + jj_la1[42] = jj_gen; break label_16; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -1503,7 +1603,7 @@ final StringBuffer buff = new StringBuffer("("); operator = jj_consume_token(RUNSIGNEDSHIFT); break; default: - jj_la1[42] = jj_gen; + jj_la1[43] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1529,7 +1629,7 @@ final StringBuffer buff = new StringBuffer("("); ; break; default: - jj_la1[43] = jj_gen; + jj_la1[44] = jj_gen; break label_17; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -1540,7 +1640,7 @@ final StringBuffer buff = new StringBuffer("("); operator = jj_consume_token(MINUS); break; default: - jj_la1[44] = jj_gen; + jj_la1[45] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1575,7 +1675,7 @@ final StringBuffer buff = new StringBuffer("("); ; break; default: - jj_la1[45] = jj_gen; + jj_la1[46] = jj_gen; break label_18; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -1589,13 +1689,13 @@ final StringBuffer buff = new StringBuffer("("); operator = jj_consume_token(REM); break; default: - jj_la1[46] = jj_gen; + jj_la1[47] = jj_gen; jj_consume_token(-1); throw new ParseException(); } expr = UnaryExpression(); - buff.append(operator.image); - buff.append(expr); + buff.append(operator.image); + buff.append(expr); } {if (true) return buff.toString();} throw new Error("Missing return statement in function"); @@ -1642,7 +1742,7 @@ final StringBuffer buff = new StringBuffer("("); ; break; default: - jj_la1[47] = jj_gen; + jj_la1[48] = jj_gen; break label_19; } jj_consume_token(AT); @@ -1652,7 +1752,7 @@ final StringBuffer buff = new StringBuffer("("); {if (true) return buff.append(expr).toString();} break; default: - jj_la1[48] = jj_gen; + jj_la1[49] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1673,7 +1773,7 @@ final StringBuffer buff = new StringBuffer("("); token = jj_consume_token(MINUS); break; default: - jj_la1[49] = jj_gen; + jj_la1[50] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1681,11 +1781,8 @@ final StringBuffer buff = new StringBuffer("("); {if (true) return token.image + expr;} break; case INCR: - expr = PreIncrementExpression(); - {if (true) return expr;} - break; case DECR: - expr = PreDecrementExpression(); + expr = PreIncDecExpression(); {if (true) return expr;} break; case ARRAY: @@ -1705,26 +1802,30 @@ final StringBuffer buff = new StringBuffer("("); {if (true) return expr;} break; default: - jj_la1[50] = jj_gen; + jj_la1[51] = jj_gen; jj_consume_token(-1); throw new ParseException(); } throw new Error("Missing return statement in function"); } - static final public String PreIncrementExpression() throws ParseException { + static final public String PreIncDecExpression() throws ParseException { final String expr; - jj_consume_token(INCR); - expr = PrimaryExpression(); - {if (true) return "++"+expr;} - throw new Error("Missing return statement in function"); - } - - static final public String PreDecrementExpression() throws ParseException { -final String expr; - jj_consume_token(DECR); +final Token token; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case INCR: + token = jj_consume_token(INCR); + break; + case DECR: + token = jj_consume_token(DECR); + break; + default: + jj_la1[52] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } expr = PrimaryExpression(); - {if (true) return "--"+expr;} + {if (true) return token.image + expr;} throw new Error("Missing return statement in function"); } @@ -1734,13 +1835,13 @@ final String expr; case BANG: jj_consume_token(BANG); expr = UnaryExpression(); - {if (true) return "!" + expr;} + {if (true) return "!" + expr;} break; default: - jj_la1[51] = jj_gen; - if (jj_2_3(2147483647)) { + jj_la1[53] = jj_gen; + if (jj_2_4(2147483647)) { expr = CastExpression(); - {if (true) return expr;} + {if (true) return expr;} } else { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ARRAY: @@ -1749,7 +1850,7 @@ final String expr; case DOLLAR: case DOLLAR_ID: expr = PostfixExpression(); - {if (true) return expr;} + {if (true) return expr;} break; case NULL: case TRUE: @@ -1758,7 +1859,7 @@ final String expr; case FLOATING_POINT_LITERAL: case STRING_LITERAL: expr = Literal(); - {if (true) return expr;} + {if (true) return expr;} break; case LPAREN: jj_consume_token(LPAREN); @@ -1768,14 +1869,14 @@ final String expr; } catch (ParseException e) { errorMessage = "')' expected"; errorLevel = ERROR; - errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = jj_input_stream.getPosition() + 1; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; {if (true) throw e;} } {if (true) return "("+expr+")";} break; default: - jj_la1[52] = jj_gen; + jj_la1[54] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1787,7 +1888,27 @@ final String expr; static final public String CastExpression() throws ParseException { final String type, expr; jj_consume_token(LPAREN); - type = Type(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case STRING: + case OBJECT: + case BOOL: + case BOOLEAN: + case REAL: + case DOUBLE: + case FLOAT: + case INT: + case INTEGER: + type = Type(); + break; + case ARRAY: + jj_consume_token(ARRAY); + type = "array"; + break; + default: + jj_la1[55] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } jj_consume_token(RPAREN); expr = UnaryExpression(); {if (true) return "(" + type + ")" + expr;} @@ -1809,13 +1930,13 @@ final String type, expr; operator = jj_consume_token(DECR); break; default: - jj_la1[53] = jj_gen; + jj_la1[56] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; default: - jj_la1[54] = jj_gen; + jj_la1[57] = jj_gen; ; } if (operator == null) { @@ -1829,7 +1950,7 @@ final String type, expr; final Token identifier; String expr; final StringBuffer buff = new StringBuffer(); - if (jj_2_4(2)) { + if (jj_2_5(2)) { identifier = jj_consume_token(IDENTIFIER); jj_consume_token(STATICCLASSACCESS); expr = ClassIdentifier(); @@ -1843,7 +1964,7 @@ final String type, expr; ; break; default: - jj_la1[55] = jj_gen; + jj_la1[58] = jj_gen; break label_20; } expr = PrimarySuffix(); @@ -1867,7 +1988,7 @@ final String type, expr; ; break; default: - jj_la1[56] = jj_gen; + jj_la1[59] = jj_gen; break label_21; } expr = PrimarySuffix(); @@ -1880,7 +2001,7 @@ final String type, expr; {if (true) return "array" + expr;} break; default: - jj_la1[57] = jj_gen; + jj_la1[60] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1902,20 +2023,20 @@ final String type, expr; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENTIFIER: token = jj_consume_token(IDENTIFIER); - {if (true) return token.image;} + {if (true) return token.image;} break; case NEW: jj_consume_token(NEW); expr = ClassIdentifier(); - {if (true) return "new " + expr;} + {if (true) return "new " + expr;} break; case DOLLAR: case DOLLAR_ID: expr = VariableDeclaratorId(); - {if (true) return expr;} + {if (true) return expr;} break; default: - jj_la1[58] = jj_gen; + jj_la1[61] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1938,7 +2059,7 @@ final String type, expr; buff.append(expr); break; default: - jj_la1[59] = jj_gen; + jj_la1[62] = jj_gen; ; } {if (true) return buff.toString();} @@ -1951,15 +2072,15 @@ final String type, expr; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IDENTIFIER: token = jj_consume_token(IDENTIFIER); - {if (true) return token.image;} + {if (true) return token.image;} break; case DOLLAR: case DOLLAR_ID: expr = VariableDeclaratorId(); - {if (true) return expr;} + {if (true) return expr;} break; default: - jj_la1[60] = jj_gen; + jj_la1[63] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1971,15 +2092,15 @@ final String type, expr; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case LPAREN: expr = Arguments(); - {if (true) return expr;} + {if (true) return expr;} break; case CLASSACCESS: case LBRACKET: expr = VariableSuffix(); - {if (true) return expr;} + {if (true) return expr;} break; default: - jj_la1[61] = jj_gen; + jj_la1[64] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2006,12 +2127,21 @@ final String type, expr; jj_consume_token(LBRACKET); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ARRAY: - case PRINT: case LIST: + case PRINT: case NEW: case NULL: case TRUE: case FALSE: + case STRING: + case OBJECT: + case BOOL: + case BOOLEAN: + case REAL: + case DOUBLE: + case FLOAT: + case INT: + case INTEGER: case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: @@ -2026,10 +2156,49 @@ final String type, expr; case MINUS: case BIT_AND: case DOLLAR_ID: - expr = Expression(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case ARRAY: + case LIST: + case PRINT: + case NEW: + case NULL: + case TRUE: + case FALSE: + case INTEGER_LITERAL: + case FLOATING_POINT_LITERAL: + case STRING_LITERAL: + case IDENTIFIER: + case LPAREN: + case AT: + case DOLLAR: + case BANG: + case INCR: + case DECR: + case PLUS: + case MINUS: + case BIT_AND: + case DOLLAR_ID: + expr = Expression(); + break; + case STRING: + case OBJECT: + case BOOL: + case BOOLEAN: + case REAL: + case DOUBLE: + case FLOAT: + case INT: + case INTEGER: + expr = Type(); + break; + default: + jj_la1[65] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } break; default: - jj_la1[62] = jj_gen; + jj_la1[66] = jj_gen; ; } try { @@ -2047,7 +2216,7 @@ final String type, expr; {if (true) return "[" + expr + "]";} break; default: - jj_la1[63] = jj_gen; + jj_la1[67] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2060,27 +2229,27 @@ final String type, expr; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case INTEGER_LITERAL: token = jj_consume_token(INTEGER_LITERAL); - {if (true) return token.image;} + {if (true) return token.image;} break; case FLOATING_POINT_LITERAL: token = jj_consume_token(FLOATING_POINT_LITERAL); - {if (true) return token.image;} + {if (true) return token.image;} break; case STRING_LITERAL: token = jj_consume_token(STRING_LITERAL); - {if (true) return token.image;} + {if (true) return token.image;} break; case TRUE: case FALSE: expr = BooleanLiteral(); - {if (true) return expr;} + {if (true) return expr;} break; case NULL: - expr = NullLiteral(); - {if (true) return expr;} + jj_consume_token(NULL); + {if (true) return "null";} break; default: - jj_la1[64] = jj_gen; + jj_la1[68] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2091,33 +2260,27 @@ final String type, expr; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case TRUE: jj_consume_token(TRUE); - {if (true) return "true";} + {if (true) return "true";} break; case FALSE: jj_consume_token(FALSE); - {if (true) return "false";} + {if (true) return "false";} break; default: - jj_la1[65] = jj_gen; + jj_la1[69] = jj_gen; jj_consume_token(-1); throw new ParseException(); } throw new Error("Missing return statement in function"); } - static final public String NullLiteral() throws ParseException { - jj_consume_token(NULL); - {if (true) return "null";} - throw new Error("Missing return statement in function"); - } - static final public String Arguments() throws ParseException { String expr = null; jj_consume_token(LPAREN); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ARRAY: - case PRINT: case LIST: + case PRINT: case NEW: case NULL: case TRUE: @@ -2139,7 +2302,7 @@ String expr = null; expr = ArgumentList(); break; default: - jj_la1[66] = jj_gen; + jj_la1[70] = jj_gen; ; } try { @@ -2170,53 +2333,43 @@ final StringBuffer buff = new StringBuffer(); ; break; default: - jj_la1[67] = jj_gen; + jj_la1[71] = jj_gen; break label_22; } jj_consume_token(COMMA); try { expr = Expression(); } catch (ParseException e) { - errorMessage = "expression expected after a comma in argument list"; + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. An 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; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; {if (true) throw e;} } - buff.append(",").append(expr); + buff.append(",").append(expr); } {if (true) return buff.toString();} throw new Error("Missing return statement in function"); } /** - * A Statement without break + * A Statement without break. */ static final public void StatementNoBreak() throws ParseException { - if (jj_2_5(2)) { + if (jj_2_6(2)) { Expression(); try { - switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { - case SEMICOLON: - jj_consume_token(SEMICOLON); - break; - case PHPEND: - jj_consume_token(PHPEND); - PHPParserTokenManager.SwitchTo(PHPParserTokenManager.DEFAULT); - break; - default: - jj_la1[68] = jj_gen; - jj_consume_token(-1); - throw new ParseException(); - } + jj_consume_token(SEMICOLON); } catch (ParseException e) { - errorMessage = "';' expected"; - errorLevel = ERROR; - errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = jj_input_stream.getPosition() + 1; - {if (true) throw e;} + if (e.currentToken.next.kind != 4) { + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + {if (true) throw e;} + } } - } else if (jj_2_6(2)) { + } else if (jj_2_7(2)) { LabeledStatement(); } else { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -2237,10 +2390,10 @@ final StringBuffer buff = new StringBuffer(); try { jj_consume_token(SEMICOLON); } catch (ParseException e) { - errorMessage = "';' expected after expression"; + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected"; errorLevel = ERROR; - errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = jj_input_stream.getPosition() + 1; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; {if (true) throw e;} } break; @@ -2281,7 +2434,7 @@ final StringBuffer buff = new StringBuffer(); jj_consume_token(AT); break; default: - jj_la1[69] = jj_gen; + jj_la1[72] = jj_gen; ; } IncludeStatement(); @@ -2293,7 +2446,7 @@ final StringBuffer buff = new StringBuffer(); GlobalStatement(); break; default: - jj_la1[70] = jj_gen; + jj_la1[73] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2301,12 +2454,13 @@ final StringBuffer buff = new StringBuffer(); } /** - * A Normal statement + * A Normal statement. */ static final public void Statement() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IF: case ARRAY: + case LIST: case PRINT: case ECHO: case INCLUDE: @@ -2315,7 +2469,6 @@ final StringBuffer buff = new StringBuffer(); case REQUIRE_ONCE: case GLOBAL: case STATIC: - case LIST: case CONTINUE: case DO: case FOR: @@ -2349,142 +2502,107 @@ final StringBuffer buff = new StringBuffer(); BreakStatement(); break; default: - jj_la1[71] = jj_gen; + jj_la1[74] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } +/** + * An html block inside a php syntax. + */ + static final public void htmlBlock() throws ParseException { + jj_consume_token(PHPEND); + label_23: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case PHPECHOSTART: + ; + break; + default: + jj_la1[75] = jj_gen; + break label_23; + } + phpEchoBlock(); + } + try { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case PHPSTARTLONG: + jj_consume_token(PHPSTARTLONG); + break; + case PHPSTARTSHORT: + jj_consume_token(PHPSTARTSHORT); + break; + default: + jj_la1[76] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } catch (ParseException e) { + errorMessage = "End of file unexpected, '= 0) { la1tokens[jj_kind] = true; jj_kind = -1; } - for (int i = 0; i < 122; i++) { + for (int i = 0; i < 126; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1< jj_gen) { @@ -5906,6 +6450,7 @@ final int pos = jj_input_stream.getPosition(); case 4: jj_3_5(); break; case 5: jj_3_6(); break; case 6: jj_3_7(); break; + case 7: jj_3_8(); break; } } p = p.next;