*** empty log message ***
[phpeclipse.git] / net.sourceforge.phpeclipse / src / test / PHPParser.jj
index 823b11e..95618cb 100644 (file)
@@ -83,6 +83,12 @@ public final class PHPParser extends PHPParserSuperclass {
   private static AstNode[] nodes;
   /** The cursor in expression stack. */
   private static int nodePtr;
+  private static VariableDeclaration[] variableDeclarationStack;
+  private static int variableDeclarationPtr;
+  private static Statement[] statementStack;
+  private static int statementPtr;
+  private static ElseIf[] elseIfStack;
+  private static int elseIfPtr;
 
   public final void setFileToParse(final IFile fileToParse) {
     this.fileToParse = fileToParse;
@@ -101,7 +107,11 @@ public final class PHPParser extends PHPParserSuperclass {
    */
   private static final void init() {
     nodes = new AstNode[AstStackIncrement];
+    statementStack = new Statement[AstStackIncrement];
+    elseIfStack = new ElseIf[AstStackIncrement];
     nodePtr = -1;
+    statementPtr = -1;
+    elseIfPtr = -1;
     htmlStart = 0;
   }
 
@@ -122,6 +132,45 @@ public final class PHPParser extends PHPParserSuperclass {
     }
   }
 
+  private static final void pushOnVariableDeclarationStack(VariableDeclaration var) {
+    try {
+      variableDeclarationStack[++variableDeclarationPtr] = var;
+    } catch (IndexOutOfBoundsException e) {
+      int oldStackLength = variableDeclarationStack.length;
+      VariableDeclaration[] oldStack = variableDeclarationStack;
+      variableDeclarationStack = new VariableDeclaration[oldStackLength + AstStackIncrement];
+      System.arraycopy(oldStack, 0, variableDeclarationStack, 0, oldStackLength);
+      variableDeclarationPtr = oldStackLength;
+      variableDeclarationStack[variableDeclarationPtr] = var;
+    }
+  }
+
+  private static final void pushOnStatementStack(Statement statement) {
+    try {
+      statementStack[++statementPtr] = statement;
+    } catch (IndexOutOfBoundsException e) {
+      int oldStackLength = statementStack.length;
+      Statement[] oldStack = statementStack;
+      statementStack = new Statement[oldStackLength + AstStackIncrement];
+      System.arraycopy(oldStack, 0, statementStack, 0, oldStackLength);
+      statementPtr = oldStackLength;
+      statementStack[statementPtr] = statement;
+    }
+  }
+
+  private static final void pushOnElseIfStack(ElseIf elseIf) {
+    try {
+      elseIfStack[++elseIfPtr] = elseIf;
+    } catch (IndexOutOfBoundsException e) {
+      int oldStackLength = elseIfStack.length;
+      ElseIf[] oldStack = elseIfStack;
+      elseIfStack = new ElseIf[oldStackLength + AstStackIncrement];
+      System.arraycopy(oldStack, 0, elseIfStack, 0, oldStackLength);
+      elseIfPtr = oldStackLength;
+      elseIfStack[elseIfPtr] = elseIf;
+    }
+  }
+
   public static final void phpParserTester(final String strEval) throws CoreException, ParseException {
     PHPParserTokenManager.SwitchTo(PHPParserTokenManager.PHPPARSING);
     final StringReader stream = new StringReader(strEval);
@@ -168,7 +217,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,29 +569,29 @@ 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:
       "\""
       (
           ~["\"","{","}"]
@@ -550,7 +601,7 @@ MORE :
       )*
       "\""
     >
-|    < STRING_2:
+|    <STRING_2:
       "'"
       (
          ~["'"]
@@ -559,7 +610,7 @@ MORE :
 
       "'"
     >
-|   < STRING_3:
+|   <STRING_3:
       "`"
       (
         ~["`"]
@@ -757,12 +808,12 @@ ClassDeclaration ClassDeclaration() :
     if (superclassName == null) {
       classDeclaration = new ClassDeclaration(currentSegment,
                                               className.image.toCharArray(),
-                                              superclassName.image.toCharArray(),
                                               pos,
                                               0);
     } else {
       classDeclaration = new ClassDeclaration(currentSegment,
                                               className.image.toCharArray(),
+                                              superclassName.image.toCharArray(),
                                               pos,
                                               0);
     }
@@ -819,22 +870,19 @@ void ClassBodyDeclaration(ClassDeclaration classDeclaration) :
 FieldDeclaration FieldDeclaration() :
 {
   VariableDeclaration variableDeclaration;
+  VariableDeclaration[] list;
+  final ArrayList arrayList = new ArrayList();
+  final int pos = SimpleCharStream.getPosition();
 }
 {
   <VAR> variableDeclaration = VariableDeclarator()
-  {
-    outlineInfo.addVariable(new String(variableDeclaration.name));
-    if (currentSegment != null) {
-      currentSegment.add(variableDeclaration);
-    }
-  }
-  ( <COMMA>
-      variableDeclaration = VariableDeclarator()
-      {
-      if (currentSegment != null) {
-        currentSegment.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);}
   )*
   try {
     <SEMICOLON>
@@ -845,6 +893,12 @@ FieldDeclaration FieldDeclaration() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
+
+  {list = new VariableDeclaration[arrayList.size()];
+   arrayList.toArray(list);
+   return new FieldDeclaration(list,
+                               pos,
+                               SimpleCharStream.getPosition());}
 }
 
 VariableDeclaration VariableDeclarator() :
@@ -867,10 +921,18 @@ VariableDeclaration VariableDeclarator() :
       throw e;
     }
   ]
-  {return new VariableDeclaration(currentSegment,
+  {
+  if (initializer == null) {
+    return new VariableDeclaration(currentSegment,
                                   varName.toCharArray(),
-                                  initializer,
-                                  pos);}
+                                  pos,
+                                  jj_input_stream.getPosition());
+  }
+    return new VariableDeclaration(currentSegment,
+                                    varName.toCharArray(),
+                                    initializer,
+                                    pos);
+  }
 }
 
 /**
@@ -998,12 +1060,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() :
@@ -1020,7 +1084,10 @@ ArrayVariableDeclaration[] ArrayInitializer() :
            ]
            [<COMMA> {list.add(null);}]
   <RPAREN>
-  {return (ArrayVariableDeclaration[]) list.toArray();}
+  {
+  ArrayVariableDeclaration[] vars = new ArrayVariableDeclaration[list.size()];
+  list.toArray(vars);
+  return vars;}
 }
 
 /**
@@ -1039,9 +1106,7 @@ MethodDeclaration MethodDeclaration() :
     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;
@@ -1079,8 +1144,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(),
@@ -1437,9 +1501,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;
@@ -1468,8 +1530,7 @@ Expression UnaryExpression() :
   <BIT_AND> expr = UnaryExpressionNoPrefix()
   {return new PrefixedUnaryExpression(expr,OperatorIds.AND,pos);}
 |
-  expr = AtUnaryExpression()
-  {return expr;}
+  expr = AtUnaryExpression() {return expr;}
 }
 
 Expression AtUnaryExpression() :
@@ -1721,7 +1782,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();
@@ -1732,7 +1793,7 @@ Literal Literal() :
 
 FunctionCall Arguments(Expression func) :
 {
-ArgumentDeclaration[] args = null;
+Expression[] args = null;
 }
 {
   <LPAREN> [ args = ArgumentList() ]
@@ -1748,18 +1809,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;
@@ -1768,7 +1834,10 @@ final ArrayList list = new ArrayList();
         throw e;
       }
    )*
-   {return (ArgumentDeclaration[]) list.toArray();}
+   {
+   Expression[] arguments = new Expression[list.size()];
+   list.toArray(arguments);
+   return arguments;}
 }
 
 /**
@@ -1860,7 +1929,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);}
@@ -1967,8 +2036,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());}
 }
 
 /**
@@ -1990,7 +2069,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";
@@ -2019,10 +2101,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) {
@@ -2045,7 +2130,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) {
@@ -2078,6 +2166,8 @@ LabeledStatement LabeledStatement() :
 Block Block() :
 {
   final int pos = SimpleCharStream.getPosition();
+  final ArrayList list = new ArrayList();
+  Statement statement;
 }
 {
   try {
@@ -2089,7 +2179,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) {
@@ -2099,6 +2190,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() :
@@ -2133,18 +2228,32 @@ 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() :
 {
   final String varName;
-  Expression init = null;
+  Expression initializer = null;
   final int pos = SimpleCharStream.getPosition();
 }
 {
-  varName = VariableDeclaratorId() [ <ASSIGN> init = Expression() ]
-  {return new VariableDeclaration(varName.toCharArray(),init,pos);}
+  varName = VariableDeclaratorId() [ <ASSIGN> initializer = Expression() ]
+  {
+   if (initializer == null) {
+    return new VariableDeclaration(currentSegment,
+                                  varName.toCharArray(),
+                                  pos,
+                                  jj_input_stream.getPosition());
+   }
+    return new VariableDeclaration(currentSegment,
+                                    varName.toCharArray(),
+                                    initializer,
+                                    pos);
+  }
 }
 
 EmptyStatement EmptyStatement() :
@@ -2159,19 +2268,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() :
@@ -2226,7 +2339,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;
@@ -2269,7 +2385,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;
@@ -2291,10 +2410,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());}
 }
 
 /**
@@ -2405,17 +2527,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 {
@@ -2439,11 +2567,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;
@@ -2451,10 +2574,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 {
@@ -2472,11 +2616,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() :
@@ -2490,7 +2638,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() :
@@ -2502,7 +2653,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() :
@@ -2514,7 +2668,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() :
@@ -2559,7 +2716,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;
@@ -2721,7 +2881,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;
@@ -2753,7 +2916,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() :