*** empty log message ***
[phpeclipse.git] / net.sourceforge.phpeclipse / src / test / PHPParser.jj
index 44e28d2..0d76a4c 100644 (file)
@@ -168,7 +168,9 @@ public final class PHPParser extends PHPParserSuperclass {
     init();
     try {
       parse();
-      //PHPeclipsePlugin.log(1,phpDocument.toString());
+      phpDocument = new PHPDocument(null);
+      phpDocument.nodes = nodes;
+      PHPeclipsePlugin.log(1,phpDocument.toString());
     } catch (ParseException e) {
       processParseException(e);
     }
@@ -518,39 +520,38 @@ MORE :
 /* LITERALS */
 <PHPPARSING> TOKEN :
 {
-  < INTEGER_LITERAL:
+  <INTEGER_LITERAL:
         <DECIMAL_LITERAL> (["l","L"])?
       | <HEX_LITERAL> (["l","L"])?
       | <OCTAL_LITERAL> (["l","L"])?
   >
 |
-  < #DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* >
+  <#DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* >
 |
-  < #HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
+  <#HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
 |
-  < #OCTAL_LITERAL: "0" (["0"-"7"])* >
+  <#OCTAL_LITERAL: "0" (["0"-"7"])* >
 |
-  < FLOATING_POINT_LITERAL:
+  <FLOATING_POINT_LITERAL:
         (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? (["f","F","d","D"])?
       | "." (["0"-"9"])+ (<EXPONENT>)? (["f","F","d","D"])?
       | (["0"-"9"])+ <EXPONENT> (["f","F","d","D"])?
       | (["0"-"9"])+ (<EXPONENT>)? ["f","F","d","D"]
   >
 |
-  < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
+  <#EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
 |
-  < STRING_LITERAL: (<STRING_1> | <STRING_2> | <STRING_3>)>
-|    < STRING_1:
+  <STRING_LITERAL: (<STRING_1> | <STRING_2> | <STRING_3>)>
+|    <STRING_1:
       "\""
       (
-          ~["\"","{","}"]
+          ~["\""]
         | "\\\""
         | "\\"
-        | "{" ~["\""] "}"
       )*
       "\""
     >
-|    < STRING_2:
+|    <STRING_2:
       "'"
       (
          ~["'"]
@@ -559,7 +560,7 @@ MORE :
 
       "'"
     >
-|   < STRING_3:
+|   <STRING_3:
       "`"
       (
         ~["`"]
@@ -819,19 +820,17 @@ void ClassBodyDeclaration(ClassDeclaration classDeclaration) :
 FieldDeclaration FieldDeclaration() :
 {
   VariableDeclaration variableDeclaration;
-  final ArrayList list = new ArrayList();
+  VariableDeclaration[] list;
+  final ArrayList arrayList = new ArrayList();
   final int pos = SimpleCharStream.getPosition();
 }
 {
   <VAR> variableDeclaration = VariableDeclarator()
-  {
-    list.add(variableDeclaration);
-    outlineInfo.addVariable(new String(variableDeclaration.name));
-    currentSegment.add(variableDeclaration);
-  }
-  ( <COMMA>
-      variableDeclaration = VariableDeclarator()
-      {list.add(variableDeclaration);
+  {arrayList.add(variableDeclaration);
+   outlineInfo.addVariable(new String(variableDeclaration.name));
+   currentSegment.add(variableDeclaration);}
+  ( <COMMA> variableDeclaration = VariableDeclarator()
+      {arrayList.add(variableDeclaration);
        outlineInfo.addVariable(new String(variableDeclaration.name));
        currentSegment.add(variableDeclaration);}
   )*
@@ -844,14 +843,17 @@ FieldDeclaration FieldDeclaration() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  {return new FieldDeclaration((VariableDeclaration[]) list.toArray(),
+
+  {list = new VariableDeclaration[arrayList.size()];
+   arrayList.toArray(list);
+   return new FieldDeclaration(list,
                                pos,
                                SimpleCharStream.getPosition());}
 }
 
 VariableDeclaration VariableDeclarator() :
 {
-  final String varName, varValue;
+  final String varName;
   Expression initializer = null;
   final int pos = jj_input_stream.getPosition();
 }
@@ -1008,12 +1010,14 @@ Expression VariableInitializer() :
 
 ArrayVariableDeclaration ArrayVariable() :
 {
-Expression expr;
-Expression expr2 = null;
+Expression expr,expr2;
 }
 {
-  expr = Expression() [<ARRAYASSIGN> expr2 = Expression()]
+  expr = Expression()
+  [<ARRAYASSIGN> expr2 = Expression()
   {return new ArrayVariableDeclaration(expr,expr2);}
+  ]
+  {return new ArrayVariableDeclaration(expr,SimpleCharStream.getPosition());}
 }
 
 ArrayVariableDeclaration[] ArrayInitializer() :
@@ -1030,7 +1034,10 @@ ArrayVariableDeclaration[] ArrayInitializer() :
            ]
            [<COMMA> {list.add(null);}]
   <RPAREN>
-  {return (ArrayVariableDeclaration[]) list.toArray();}
+  {
+  ArrayVariableDeclaration[] vars = new ArrayVariableDeclaration[list.size()];
+  list.toArray(vars);
+  return vars;}
 }
 
 /**
@@ -1040,18 +1047,15 @@ ArrayVariableDeclaration[] ArrayInitializer() :
 MethodDeclaration MethodDeclaration() :
 {
   final MethodDeclaration functionDeclaration;
-  Token functionToken;
   final Block block;
 }
 {
-  functionToken = <FUNCTION>
+  <FUNCTION>
   try {
     functionDeclaration = MethodDeclarator()
     {outlineInfo.addVariable(new String(functionDeclaration.name));}
   } catch (ParseException e) {
-    if (errorMessage != null) {
-      throw 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;
@@ -1089,8 +1093,7 @@ MethodDeclaration MethodDeclarator() :
   final int pos = SimpleCharStream.getPosition();
 }
 {
-  [ reference = <BIT_AND> ]
-  identifier = <IDENTIFIER>
+  [reference = <BIT_AND>] identifier = <IDENTIFIER>
   formalParameters = FormalParameters()
   {return new MethodDeclaration(currentSegment,
                                  identifier.image.toCharArray(),
@@ -1106,8 +1109,6 @@ MethodDeclaration MethodDeclarator() :
  */
 Hashtable FormalParameters() :
 {
-  String expr;
-  final StringBuffer buff = new StringBuffer("(");
   VariableDeclaration var;
   final Hashtable parameters = new Hashtable();
 }
@@ -1447,9 +1448,7 @@ Expression MultiplicativeExpression() :
   try {
     expr = UnaryExpression()
   } catch (ParseException e) {
-    if (errorMessage != null) {
-      throw e;
-    }
+    if (errorMessage != null) throw e;
     errorMessage = "unexpected token '"+e.currentToken.next.image+"'";
     errorLevel   = ERROR;
     errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1;
@@ -1478,8 +1477,7 @@ Expression UnaryExpression() :
   <BIT_AND> expr = UnaryExpressionNoPrefix()
   {return new PrefixedUnaryExpression(expr,OperatorIds.AND,pos);}
 |
-  expr = AtUnaryExpression()
-  {return expr;}
+  expr = AtUnaryExpression() {return expr;}
 }
 
 Expression AtUnaryExpression() :
@@ -1590,7 +1588,6 @@ Expression PrimaryExpression() :
 {
   final Token identifier;
   Expression expr;
-  final StringBuffer buff = new StringBuffer();
   final int pos = SimpleCharStream.getPosition();
 }
 {
@@ -1731,7 +1728,7 @@ Literal Literal() :
 | token = <FLOATING_POINT_LITERAL> {pos = SimpleCharStream.getPosition();
                                     return new NumberLiteral(token.image.toCharArray(),pos-token.image.length(),pos);}
 | token = <STRING_LITERAL>         {pos = SimpleCharStream.getPosition();
-                                    return new StringLiteral(token.image.toCharArray(),pos-token.image.length(),pos);}
+                                    return new StringLiteral(token.image.toCharArray(),pos-token.image.length());}
 | <TRUE>                           {pos = SimpleCharStream.getPosition();
                                     return new TrueLiteral(pos-4,pos);}
 | <FALSE>                          {pos = SimpleCharStream.getPosition();
@@ -1742,7 +1739,7 @@ Literal Literal() :
 
 FunctionCall Arguments(Expression func) :
 {
-ArgumentDeclaration[] args = null;
+Expression[] args = null;
 }
 {
   <LPAREN> [ args = ArgumentList() ]
@@ -1758,18 +1755,23 @@ ArgumentDeclaration[] args = null;
   {return new FunctionCall(func,args,SimpleCharStream.getPosition());}
 }
 
-ArgumentDeclaration[] ArgumentList() :
+/**
+ * An argument list is a list of arguments separated by comma :
+ * argumentDeclaration() (, argumentDeclaration)*
+ * @return an array of arguments
+ */
+Expression[] ArgumentList() :
 {
-Expression expr;
+Expression arg;
 final ArrayList list = new ArrayList();
 }
 {
-  expr = Expression()
-  {list.add(expr);}
+  arg = Expression()
+  {list.add(arg);}
   ( <COMMA>
       try {
-        expr = Expression()
-        {list.add(expr);}
+        arg = Expression()
+        {list.add(arg);}
       } catch (ParseException e) {
         errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. An expression expected after a comma in argument list";
         errorLevel   = ERROR;
@@ -1778,7 +1780,10 @@ final ArrayList list = new ArrayList();
         throw e;
       }
    )*
-   {return (ArgumentDeclaration[]) list.toArray();}
+   {
+   Expression[] arguments = new Expression[list.size()];
+   list.toArray(arguments);
+   return arguments;}
 }
 
 /**
@@ -1870,7 +1875,7 @@ HTMLBlock htmlBlock() :
     throw e;
   }
   {
-  nbNodes = nodePtr-startIndex;
+  nbNodes = nodePtr-startIndex - 1;
   blockNodes = new AstNode[nbNodes];
   System.arraycopy(nodes,startIndex,blockNodes,0,nbNodes);
   return new HTMLBlock(nodes);}
@@ -1882,7 +1887,6 @@ HTMLBlock htmlBlock() :
 InclusionStatement IncludeStatement() :
 {
   final Expression expr;
-  final Token token;
   final int keyword;
   final int pos = jj_input_stream.getPosition();
   final InclusionStatement inclusionStatement;
@@ -1977,8 +1981,18 @@ ListExpression ListExpression() :
     throw e;
   }
   [ <ASSIGN> expression = Expression()
-    {return new ListExpression((String[]) list.toArray(),expression,pos,SimpleCharStream.getPosition());}]
-  {return new ListExpression((String[]) list.toArray(),null,pos,SimpleCharStream.getPosition());}
+    {
+    String[] strings = new String[list.size()];
+    list.toArray(strings);
+    return new ListExpression(strings,
+                              expression,
+                              pos,
+                              SimpleCharStream.getPosition());}
+  ]
+  {
+    String[] strings = new String[list.size()];
+    list.toArray(strings);
+    return new ListExpression(strings,pos,SimpleCharStream.getPosition());}
 }
 
 /**
@@ -2000,7 +2014,10 @@ EchoStatement EchoStatement() :
   )*
   try {
     <SEMICOLON>
-    {return new EchoStatement((Expression[]) expressions.toArray(),pos);}
+    {
+    Expression[] exprs = new Expression[expressions.size()];
+    expressions.toArray(exprs);
+    return new EchoStatement(exprs,pos);}
   } catch (ParseException e) {
     if (e.currentToken.next.kind != 4) {
       errorMessage = "';' expected after 'echo' statement";
@@ -2029,10 +2046,13 @@ GlobalStatement GlobalStatement() :
   )*
   try {
     <SEMICOLON>
-    {global = new GlobalStatement(currentSegment,
-                                  (String[]) vars.toArray(),
-                                  pos,
-                                  SimpleCharStream.getPosition());
+    {
+    String[] strings = new String[vars.size()];
+    vars.toArray(strings);
+    global = new GlobalStatement(currentSegment,
+                                 strings,
+                                 pos,
+                                 SimpleCharStream.getPosition());
     currentSegment.add(global);
     return global;}
   } catch (ParseException e) {
@@ -2055,7 +2075,10 @@ StaticStatement StaticStatement() :
   (<COMMA> expr = VariableDeclarator() {vars.add(new String(expr.name));})*
   try {
     <SEMICOLON>
-    {return new StaticStatement((String[])vars.toArray(),
+    {
+    String[] strings = new String[vars.size()];
+    vars.toArray(strings);
+    return new StaticStatement(strings,
                                 pos,
                                 SimpleCharStream.getPosition());}
   } catch (ParseException e) {
@@ -2088,6 +2111,8 @@ LabeledStatement LabeledStatement() :
 Block Block() :
 {
   final int pos = SimpleCharStream.getPosition();
+  final ArrayList list = new ArrayList();
+  Statement statement;
 }
 {
   try {
@@ -2099,7 +2124,8 @@ Block Block() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  ( BlockStatement() | htmlBlock())*
+  ( statement = BlockStatement() {list.add(statement);}
+  | statement = htmlBlock()      {list.add(statement);})*
   try {
     <RBRACE>
   } catch (ParseException e) {
@@ -2109,6 +2135,10 @@ Block Block() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
+  {
+  Statement[] statements = new Statement[list.size()];
+  list.toArray(statements);
+  return new Block(statements,pos,SimpleCharStream.getPosition());}
 }
 
 Statement BlockStatement() :
@@ -2143,7 +2173,10 @@ VariableDeclaration[] LocalVariableDeclaration() :
   var = LocalVariableDeclarator()
   {list.add(var);}
   ( <COMMA> var = LocalVariableDeclarator() {list.add(var);})*
-  {return (VariableDeclaration[]) list.toArray();}
+  {
+    VariableDeclaration[] vars = new VariableDeclaration[list.size()];
+    list.toArray(vars);
+  return vars;}
 }
 
 VariableDeclaration LocalVariableDeclarator() :
@@ -2180,19 +2213,23 @@ EmptyStatement EmptyStatement() :
 
 Statement StatementExpression() :
 {
-  Expression expr;
+  Expression expr,expr2;
+  int operator;
 }
 {
   expr = PreIncDecExpression() {return expr;}
 |
   expr = PrimaryExpression()
-  [ <INCR> {expr = new PostfixedUnaryExpression(expr,
+  [ <INCR> {return new PostfixedUnaryExpression(expr,
                                                 OperatorIds.PLUS_PLUS,
                                                 SimpleCharStream.getPosition());}
-  | <DECR> {expr = new PostfixedUnaryExpression(expr,
+  | <DECR> {return new PostfixedUnaryExpression(expr,
                                                 OperatorIds.MINUS_MINUS,
                                                 SimpleCharStream.getPosition());}
-  | AssignmentOperator() Expression() ]
+  | operator = AssignmentOperator() expr2 = Expression()
+    {return new BinaryExpression(expr,expr2,operator);}
+  ]
+  {return expr;}
 }
 
 SwitchStatement SwitchStatement() :
@@ -2247,7 +2284,10 @@ AbstractCase[] switchStatementBrace() :
  ( cas = switchLabel0() {cases.add(cas);})*
   try {
     <RBRACE>
-    {return (AbstractCase[]) cases.toArray();}
+    {
+    AbstractCase[] abcase = new AbstractCase[cases.size()];
+    cases.toArray(abcase);
+    return abcase;}
   } catch (ParseException e) {
     errorMessage = "'}' expected";
     errorLevel   = ERROR;
@@ -2290,7 +2330,10 @@ AbstractCase[] switchStatementColon(final int start, final int end) :
   }
   try {
     <SEMICOLON>
-    {return (AbstractCase[]) cases.toArray();}
+    {
+    AbstractCase[] abcase = new AbstractCase[cases.size()];
+    cases.toArray(abcase);
+    return abcase;}
   } catch (ParseException e) {
     errorMessage = "';' expected after 'endswitch' keyword";
     errorLevel   = ERROR;
@@ -2312,10 +2355,13 @@ AbstractCase switchLabel0() :
   ( statement = BlockStatementNoBreak() {stmts.add(statement);}
   | statement = htmlBlock()             {stmts.add(statement);})*
   [ statement = BreakStatement()        {stmts.add(statement);}]
-  {if (expr == null) {//it's a default
-    return new DefaultCase((Statement[]) stmts.toArray(),pos,SimpleCharStream.getPosition());
+  {
+  Statement[] stmtsArray = new Statement[stmts.size()];
+  stmts.toArray(stmtsArray);
+  if (expr == null) {//it's a default
+    return new DefaultCase(stmtsArray,pos,SimpleCharStream.getPosition());
   }
-  return new Case(expr,(Statement[]) stmts.toArray(),pos,SimpleCharStream.getPosition());}
+  return new Case(expr,stmtsArray,pos,SimpleCharStream.getPosition());}
 }
 
 /**
@@ -2326,7 +2372,6 @@ AbstractCase switchLabel0() :
  */
 Expression SwitchLabel() :
 {
-  final Token token;
   final Expression expr;
 }
 {
@@ -2426,17 +2471,23 @@ Expression Condition(final String keyword) :
 IfStatement IfStatement0(Expression condition, final int start,final int end) :
 {
   Statement statement;
+  Statement stmt;
+  final Statement[] statementsArray;
   ElseIf elseifStatement;
   Else elseStatement = null;
-  ArrayList stmts = new ArrayList();
-  ArrayList elseifs = new ArrayList();
+  ArrayList stmts;
+  final ArrayList elseIfList = new ArrayList();
+  ElseIf[] elseIfs;
   int pos = SimpleCharStream.getPosition();
+  int endStatements;
 }
 {
   <COLON>
+  {stmts = new ArrayList();}
   (  statement = Statement() {stmts.add(statement);}
    | statement = htmlBlock() {stmts.add(statement);})*
-   (elseifStatement = ElseIfStatementColon() {elseifs.add(elseifStatement);})*
+   {endStatements = SimpleCharStream.getPosition();}
+   (elseifStatement = ElseIfStatementColon() {elseIfList.add(elseifStatement);})*
    [elseStatement = ElseStatementColon()]
 
   {try {
@@ -2460,11 +2511,6 @@ IfStatement IfStatement0(Expression condition, final int start,final int end) :
   }
   try {
     <SEMICOLON>
-    {return new IfStatement(condition,
-                            (ElseIf[]) elseifs.toArray(),
-                            elseStatement,
-                            pos,
-                            SimpleCharStream.getPosition());}
   } catch (ParseException e) {
     errorMessage = "';' expected after 'endif' keyword";
     errorLevel   = ERROR;
@@ -2472,10 +2518,31 @@ IfStatement IfStatement0(Expression condition, final int start,final int end) :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
+    {
+    elseIfs = new ElseIf[elseIfList.size()];
+    elseIfList.toArray(elseIfs);
+    if (stmts.size() == 1) {
+      return new IfStatement(condition,
+                             (Statement) stmts.get(0),
+                              elseIfs,
+                              elseStatement,
+                              pos,
+                              SimpleCharStream.getPosition());
+    } else {
+      statementsArray = new Statement[stmts.size()];
+      stmts.toArray(statementsArray);
+      return new IfStatement(condition,
+                             new Block(statementsArray,pos,endStatements),
+                              elseIfs,
+                              elseStatement,
+                              pos,
+                              SimpleCharStream.getPosition());
+    }
+    }
+
 |
-  (statement = Statement() | statement = htmlBlock())
-  {stmts.add(statement);}
-  ( LOOKAHEAD(1) elseifStatement = ElseIfStatement() {elseifs.add(elseifStatement);})*
+  (stmt = Statement() | stmt = htmlBlock())
+  ( LOOKAHEAD(1) elseifStatement = ElseIfStatement() {elseIfList.add(elseifStatement);})*
   [ LOOKAHEAD(1)
     <ELSE>
     try {
@@ -2493,11 +2560,15 @@ IfStatement IfStatement0(Expression condition, final int start,final int end) :
       throw e;
     }
   ]
-  {return new IfStatement(condition,
-                          (ElseIf[]) elseifs.toArray(),
-                          elseStatement,
-                          pos,
-                          SimpleCharStream.getPosition());}
+  {
+    elseIfs = new ElseIf[elseIfList.size()];
+    elseIfList.toArray(elseIfs);
+    return new IfStatement(condition,
+                           stmt,
+                           elseIfs,
+                           elseStatement,
+                           pos,
+                           SimpleCharStream.getPosition());}
 }
 
 ElseIf ElseIfStatementColon() :
@@ -2511,7 +2582,10 @@ ElseIf ElseIfStatementColon() :
   <ELSEIF> condition = Condition("elseif")
   <COLON> (  statement = Statement() {list.add(statement);}
            | statement = htmlBlock() {list.add(statement);})*
-  {return new ElseIf(condition,(Statement[]) list.toArray(),pos,SimpleCharStream.getPosition());}
+  {
+  Statement[] stmtsArray = new Statement[list.size()];
+  list.toArray(stmtsArray);
+  return new ElseIf(condition,stmtsArray ,pos,SimpleCharStream.getPosition());}
 }
 
 Else ElseStatementColon() :
@@ -2523,7 +2597,10 @@ Else ElseStatementColon() :
 {
   <ELSE> <COLON> (  statement = Statement() {list.add(statement);}
                   | statement = htmlBlock() {list.add(statement);})*
-  {return new Else((Statement[]) list.toArray(),pos,SimpleCharStream.getPosition());}
+  {
+  Statement[] stmtsArray = new Statement[list.size()];
+  list.toArray(stmtsArray);
+  return new Else(stmtsArray,pos,SimpleCharStream.getPosition());}
 }
 
 ElseIf ElseIfStatement() :
@@ -2535,7 +2612,10 @@ ElseIf ElseIfStatement() :
 }
 {
   <ELSEIF> condition = Condition("elseif") statement = Statement() {list.add(statement);/*todo:do better*/}
-  {return new ElseIf(condition,(Statement[]) list.toArray(),pos,SimpleCharStream.getPosition());}
+  {
+  Statement[] stmtsArray = new Statement[list.size()];
+  list.toArray(stmtsArray);
+  return new ElseIf(condition,stmtsArray,pos,SimpleCharStream.getPosition());}
 }
 
 WhileStatement WhileStatement() :
@@ -2580,7 +2660,10 @@ Statement WhileStatement0(final int start, final int end) :
   }
   try {
     <SEMICOLON>
-    {return new Block((Statement[]) stmts.toArray(),pos,SimpleCharStream.getPosition());}
+    {
+    Statement[] stmtsArray = new Statement[stmts.size()];
+    stmts.toArray(stmtsArray);
+    return new Block(stmtsArray,pos,SimpleCharStream.getPosition());}
   } catch (ParseException e) {
     errorMessage = "';' expected after 'endwhile' keyword";
     errorLevel   = ERROR;
@@ -2617,7 +2700,6 @@ ForeachStatement ForeachStatement() :
 {
   Statement statement;
   Expression expression;
-  final StringBuffer buff = new StringBuffer();
   final int pos = SimpleCharStream.getPosition();
   ArrayVariableDeclaration variable;
 }
@@ -2742,7 +2824,10 @@ final int startBlock, endBlock;
       }
       try {
         <SEMICOLON>
-        {return new ForStatement(initializations,condition,increments,new Block((Statement[])list.toArray(),startBlock,endBlock),pos,SimpleCharStream.getPosition());}
+        {
+        Statement[] stmtsArray = new Statement[list.size()];
+        list.toArray(stmtsArray);
+        return new ForStatement(initializations,condition,increments,new Block(stmtsArray,startBlock,endBlock),pos,SimpleCharStream.getPosition());}
       } catch (ParseException e) {
         errorMessage = "';' expected after 'endfor' keyword";
         errorLevel   = ERROR;
@@ -2774,7 +2859,10 @@ Statement[] StatementExpressionList() :
 {
   expr = StatementExpression()   {list.add(expr);}
   (<COMMA> StatementExpression() {list.add(expr);})*
-  {return (Statement[]) list.toArray();}
+  {
+  Statement[] stmtsArray = new Statement[list.size()];
+  list.toArray(stmtsArray);
+  return stmtsArray;}
 }
 
 Continue ContinueStatement() :