*** empty log message ***
authorkpouer <kpouer>
Thu, 1 May 2003 13:12:37 +0000 (13:12 +0000)
committerkpouer <kpouer>
Thu, 1 May 2003 13:12:37 +0000 (13:12 +0000)
net.sourceforge.phpeclipse/src/test/PHPParser.java
net.sourceforge.phpeclipse/src/test/PHPParser.jj
net.sourceforge.phpeclipse/src/test/PHPParserConstants.java
net.sourceforge.phpeclipse/src/test/PHPParserTokenManager.java
net.sourceforge.phpeclipse/src/test/SimpleCharStream.java

index bc7c112..f7bc34d 100644 (file)
@@ -9,14 +9,16 @@ import org.eclipse.jface.preference.IPreferenceStore;
 
 import java.util.Hashtable;
 import java.util.Enumeration;
+import java.util.ArrayList;
 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.*;
 import net.sourceforge.phpdt.internal.compiler.ast.*;
+import net.sourceforge.phpdt.internal.compiler.parser.OutlineableWithChildren;
+import net.sourceforge.phpdt.internal.compiler.parser.PHPOutlineInfo;
 
 /**
  * A new php parser.
@@ -31,13 +33,13 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
   private static IFile fileToParse;
 
   /** The current segment. */
-  private static PHPSegmentWithChildren currentSegment;
+  private static OutlineableWithChildren currentSegment;
 
   private static final String PARSE_ERROR_STRING = "Parse error"; //$NON-NLS-1$
   private static final String PARSE_WARNING_STRING = "Warning"; //$NON-NLS-1$
   static PHPOutlineInfo outlineInfo;
 
-  private static PHPFunctionDeclaration currentFunction;
+  public static MethodDeclaration currentFunction;
   private static boolean assigning;
 
   /** The error level of the current ParseException. */
@@ -47,13 +49,19 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
 
   private static int errorStart = -1;
   private static int errorEnd = -1;
+  private static PHPDocument phpDocument;
+  /**
+   * The point where html starts.
+   * It will be used by the token manager to create HTMLCode objects
+   */
+  public static int htmlStart;
 
   //ast stack
   private final static int AstStackIncrement = 100;
   /** The stack of node. */
-  private static AstNode[] astStack;
+  private static AstNode[] nodes;
   /** The cursor in expression stack. */
-        private static int expressionPtr;
+  private static int nodePtr;
 
   public final void setFileToParse(final IFile fileToParse) {
     this.fileToParse = fileToParse;
@@ -67,6 +75,32 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
     this.fileToParse = fileToParse;
   }
 
+  /**
+   * Reinitialize the parser.
+   */
+  private static final void init() {
+    nodes = new AstNode[AstStackIncrement];
+    nodePtr = -1;
+    htmlStart = 0;
+  }
+
+  /**
+   * Add an php node on the stack.
+   * @param node the node that will be added to the stack
+   */
+  private static final void pushOnAstNodes(AstNode node) {
+    try {
+      nodes[++nodePtr] = node;
+    } catch (IndexOutOfBoundsException e) {
+      int oldStackLength = nodes.length;
+      AstNode[] oldStack = nodes;
+      nodes = new AstNode[oldStackLength + AstStackIncrement];
+      System.arraycopy(oldStack, 0, nodes, 0, oldStackLength);
+      nodePtr = oldStackLength;
+      nodes[nodePtr] = node;
+    }
+  }
+
   public static final void phpParserTester(final String strEval) throws CoreException, ParseException {
     PHPParserTokenManager.SwitchTo(PHPParserTokenManager.PHPPARSING);
     final StringReader stream = new StringReader(strEval);
@@ -74,7 +108,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];
+    init();
     phpTest();
   }
 
@@ -85,7 +119,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
         jj_input_stream = new SimpleCharStream(stream, 1, 1);
       }
       ReInit(stream);
-      astStack = new AstNode[AstStackIncrement];
+      init();
       phpFile();
     } catch (FileNotFoundException e) {
       e.printStackTrace();  //To change body of catch statement use Options | File Templates.
@@ -98,21 +132,22 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
       jj_input_stream = new SimpleCharStream(stream, 1, 1);
     }
     ReInit(stream);
-    astStack = new AstNode[AstStackIncrement];
+    init();
     phpFile();
   }
 
   public final PHPOutlineInfo parseInfo(final Object parent, final String s) {
+    currentSegment = new PHPDocument(parent);
     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);
-    astStack = new AstNode[AstStackIncrement];
+    init();
     try {
       parse();
+      //PHPeclipsePlugin.log(1,phpDocument.toString());
     } catch (ParseException e) {
       processParseException(e);
     }
@@ -235,7 +270,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
       jj_input_stream = new SimpleCharStream(stream, 1, 1);
     }
     ReInit(stream);
-    astStack = new AstNode[AstStackIncrement];
+    init();
     try {
       parse();
     } catch (ParseException e) {
@@ -265,6 +300,18 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
     }
   }
 
+  /**
+   * Put a new html block in the stack.
+   */
+  public static final void createNewHTMLCode() {
+    final int currentPosition = SimpleCharStream.getPosition();
+    if (currentPosition == htmlStart) {
+      return;
+    }
+    final char[] chars = SimpleCharStream.currentBuffer.substring(htmlStart,currentPosition).toCharArray();
+    pushOnAstNodes(new HTMLCode(chars, htmlStart,currentPosition));
+  }
+
   private static final void parse() throws ParseException {
           phpFile();
   }
@@ -272,6 +319,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
   static final public void phpTest() throws ParseException {
     Php();
     jj_consume_token(0);
+   PHPParser.createNewHTMLCode();
   }
 
   static final public void phpFile() throws ParseException {
@@ -308,13 +356,6 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
         case FALSE:
         case WHILE:
         case FOREACH:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case SEMICOLON:
         case AT:
         case DOLLAR:
         case BANG:
@@ -323,6 +364,13 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
         case PLUS:
         case MINUS:
         case BIT_AND:
+        case INTEGER_LITERAL:
+        case FLOATING_POINT_LITERAL:
+        case STRING_LITERAL:
+        case IDENTIFIER:
+        case LPAREN:
+        case LBRACE:
+        case SEMICOLON:
         case DOLLAR_ID:
           ;
           break;
@@ -382,13 +430,6 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
     case FALSE:
     case WHILE:
     case FOREACH:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case LBRACE:
-    case SEMICOLON:
     case AT:
     case DOLLAR:
     case BANG:
@@ -397,6 +438,13 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
     case PLUS:
     case MINUS:
     case BIT_AND:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
+    case LBRACE:
+    case SEMICOLON:
     case DOLLAR_ID:
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case PHPSTARTSHORT:
@@ -446,9 +494,12 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
     }
   }
 
-  static final public void phpEchoBlock() throws ParseException {
+  static final public PHPEchoBlock phpEchoBlock() throws ParseException {
+  final Expression expr;
+  final int pos = SimpleCharStream.getPosition();
+  PHPEchoBlock echoBlock;
     jj_consume_token(PHPECHOSTART);
-    Expression();
+    expr = Expression();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case SEMICOLON:
       jj_consume_token(SEMICOLON);
@@ -458,6 +509,10 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
       ;
     }
     jj_consume_token(PHPEND);
+  echoBlock = new PHPEchoBlock(expr,pos,SimpleCharStream.getPosition());
+  pushOnAstNodes(echoBlock);
+  {if (true) return echoBlock;}
+    throw new Error("Missing return statement in function");
   }
 
   static final public void Php() throws ParseException {
@@ -489,13 +544,6 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
       case FALSE:
       case WHILE:
       case FOREACH:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
       case AT:
       case DOLLAR:
       case BANG:
@@ -504,6 +552,13 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
       case PLUS:
       case MINUS:
       case BIT_AND:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case IDENTIFIER:
+      case LPAREN:
+      case LBRACE:
+      case SEMICOLON:
       case DOLLAR_ID:
         ;
         break;
@@ -515,9 +570,10 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
     }
   }
 
-  static final public void ClassDeclaration() throws ParseException {
-  final PHPClassDeclaration classDeclaration;
+  static final public ClassDeclaration ClassDeclaration() throws ParseException {
+  final ClassDeclaration classDeclaration;
   final Token className;
+  Token superclassName = null;
   final int pos;
     jj_consume_token(CLASS);
     try {
@@ -534,7 +590,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
     case EXTENDS:
       jj_consume_token(EXTENDS);
       try {
-        jj_consume_token(IDENTIFIER);
+        superclassName = jj_consume_token(IDENTIFIER);
       } catch (ParseException e) {
       errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', identifier expected";
       errorLevel   = ERROR;
@@ -547,18 +603,29 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
       jj_la1[6] = jj_gen;
       ;
     }
-    if (currentSegment != null) {
-      classDeclaration = new PHPClassDeclaration(currentSegment,className.image,pos);
+    if (superclassName == null) {
+      classDeclaration = new ClassDeclaration(currentSegment,
+                                              className.image.toCharArray(),
+                                              superclassName.image.toCharArray(),
+                                              pos,
+                                              0);
+    } else {
+      classDeclaration = new ClassDeclaration(currentSegment,
+                                              className.image.toCharArray(),
+                                              pos,
+                                              0);
+    }
       currentSegment.add(classDeclaration);
       currentSegment = classDeclaration;
-    }
-    ClassBody();
-    if (currentSegment != null) {
-      currentSegment = (PHPSegmentWithChildren) currentSegment.getParent();
-    }
+    ClassBody(classDeclaration);
+   currentSegment = (OutlineableWithChildren) currentSegment.getParent();
+   classDeclaration.sourceEnd = SimpleCharStream.getPosition();
+   pushOnAstNodes(classDeclaration);
+   {if (true) return classDeclaration;}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void ClassBody() throws ParseException {
+  static final public void ClassBody(ClassDeclaration classDeclaration) throws ParseException {
     try {
       jj_consume_token(LBRACE);
     } catch (ParseException e) {
@@ -579,7 +646,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
         jj_la1[7] = jj_gen;
         break label_3;
       }
-      ClassBodyDeclaration();
+      ClassBodyDeclaration(classDeclaration);
     }
     try {
       jj_consume_token(RBRACE);
@@ -595,13 +662,17 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
 /**
  * A class can contain only methods and fields.
  */
-  static final public void ClassBodyDeclaration() throws ParseException {
+  static final public void ClassBodyDeclaration(ClassDeclaration classDeclaration) throws ParseException {
+  MethodDeclaration method;
+  FieldDeclaration field;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case FUNCTION:
-      MethodDeclaration();
+      method = MethodDeclaration();
+                                classDeclaration.addMethod(method);
       break;
     case VAR:
-      FieldDeclaration();
+      field = FieldDeclaration();
+                                classDeclaration.addVariable(field);
       break;
     default:
       jj_la1[8] = jj_gen;
@@ -613,11 +684,11 @@ 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;
+  static final public FieldDeclaration FieldDeclaration() throws ParseException {
+  VariableDeclaration variableDeclaration;
     jj_consume_token(VAR);
     variableDeclaration = VariableDeclarator();
-    outlineInfo.addVariable(variableDeclaration.getVariable().getName());
+    outlineInfo.addVariable(new String(variableDeclaration.name));
     if (currentSegment != null) {
       currentSegment.add(variableDeclaration);
     }
@@ -646,18 +717,19 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public PHPVarDeclaration VariableDeclarator() throws ParseException {
+  static final public VariableDeclaration VariableDeclarator() throws ParseException {
   final String varName, varValue;
+  Expression initializer = null;
   final int pos = jj_input_stream.getPosition();
     varName = VariableDeclaratorId();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case ASSIGN:
       jj_consume_token(ASSIGN);
       try {
-        varValue = VariableInitializer();
-       {if (true) return new PHPVarDeclaration(currentSegment,varName,pos,varValue);}
+        initializer = VariableInitializer();
       } catch (ParseException e) {
       errorMessage = "Literal expression expected in variable initializer";
       errorLevel   = ERROR;
@@ -670,13 +742,23 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
       jj_la1[10] = jj_gen;
       ;
     }
-   {if (true) return new PHPVarDeclaration(currentSegment,varName,pos);}
+   {if (true) return new VariableDeclaration(currentSegment,
+                                  varName.toCharArray(),
+                                  initializer,
+                                  pos);}
     throw new Error("Missing return statement in function");
   }
 
+/**
+ * A Variable name.
+ * @return the variable name (with suffix)
+ */
   static final public String VariableDeclaratorId() throws ParseException {
   String expr;
+  Expression expression;
   final StringBuffer buff = new StringBuffer();
+  final int pos = SimpleCharStream.getPosition();
+  ConstantIdentifier ex;
     try {
       expr = Variable();
                          buff.append(expr);
@@ -687,8 +769,11 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
         } else {
           break label_5;
         }
-        expr = VariableSuffix();
-                               buff.append(expr);
+       ex = new ConstantIdentifier(expr.toCharArray(),
+                                   pos,
+                                   SimpleCharStream.getPosition());
+        expression = VariableSuffix(ex);
+       buff.append(expression.toStringExpression());
       }
      {if (true) return buff.toString();}
     } catch (ParseException e) {
@@ -702,31 +787,31 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
   }
 
   static final public String Variable() throws ParseException {
-  String expr = null;
+  final StringBuffer buff;
+  Expression expression = null;
   final Token token;
+  final String expr;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case DOLLAR_ID:
       token = jj_consume_token(DOLLAR_ID);
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case LBRACE:
         jj_consume_token(LBRACE);
-        expr = Expression();
+        expression = Expression();
         jj_consume_token(RBRACE);
         break;
       default:
         jj_la1[11] = jj_gen;
         ;
       }
-    if (expr == null && !assigning) {
-      if (currentFunction != null) {
-        PHPVarDeclaration var = currentFunction.getParameter(token.image.substring(1));
-        if (var != null) {
-          var.getVariable().setUsed(true);
-        }
-      }
+    if (expression == null && !assigning) {
       {if (true) return token.image.substring(1);}
     }
-    {if (true) return token + "{" + expr + "}";}
+    buff = new StringBuffer(token.image);
+    buff.append('{');
+    buff.append(expression.toStringExpression());
+    buff.append('}');
+    {if (true) return buff.toString();}
       break;
     case DOLLAR:
       jj_consume_token(DOLLAR);
@@ -742,58 +827,51 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon
   }
 
   static final public String VariableName() throws ParseException {
-String expr = null;
-final Token token;
+  final StringBuffer buff;
+  String expr = null;
+  Expression expression = null;
+  final Token token;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case LBRACE:
       jj_consume_token(LBRACE);
-      expr = Expression();
+      expression = Expression();
       jj_consume_token(RBRACE);
-   {if (true) return "{"+expr+"}";}
+   buff = new StringBuffer('{');
+   buff.append(expression.toStringExpression());
+   buff.append('}');
+   {if (true) return buff.toString();}
       break;
     case IDENTIFIER:
       token = jj_consume_token(IDENTIFIER);
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case LBRACE:
         jj_consume_token(LBRACE);
-        expr = Expression();
+        expression = Expression();
         jj_consume_token(RBRACE);
         break;
       default:
         jj_la1[13] = jj_gen;
         ;
       }
-    if (expr == null) {
-      if (currentFunction != null) {
-        PHPVarDeclaration var = currentFunction.getParameter(token.image);
-        if (var != null) {
-          var.getVariable().setUsed(true);
-        }
-      }
+    if (expression == null) {
       {if (true) return token.image;}
     }
-    {if (true) return token + "{" + expr + "}";}
+    buff = new StringBuffer(token.image);
+    buff.append('{');
+    buff.append(expression.toStringExpression());
+    buff.append('}');
+    {if (true) return buff.toString();}
       break;
     case DOLLAR:
       jj_consume_token(DOLLAR);
       expr = VariableName();
-    if (currentFunction != null) {
-      PHPVarDeclaration var = currentFunction.getParameter(expr);
-      if (var != null) {
-        var.getVariable().setUsed(true);
-      }
-    }
-    {if (true) return "$" + expr;}
+    buff = new StringBuffer('$');
+    buff.append(expr);
+    {if (true) return buff.toString();}
       break;
     case DOLLAR_ID:
       token = jj_consume_token(DOLLAR_ID);
-    if (currentFunction != null) {
-      PHPVarDeclaration var = currentFunction.getParameter(token.image.substring(1));
-      if (var != null) {
-        var.getVariable().setUsed(true);
-      }
-    }
-    {if (true) return token.image + expr;}
+                       {if (true) return token.image;}
       break;
     default:
       jj_la1[14] = jj_gen;
@@ -803,9 +881,10 @@ final Token token;
     throw new Error("Missing return statement in function");
   }
 
-  static final public String VariableInitializer() throws ParseException {
-  final String expr;
+  static final public Expression VariableInitializer() throws ParseException {
+  final Expression expr;
   final Token token;
+  final int pos = SimpleCharStream.getPosition();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case NULL:
     case TRUE:
@@ -830,7 +909,11 @@ final Token token;
         jj_consume_token(-1);
         throw new ParseException();
       }
-   {if (true) return "-" + token.image;}
+   {if (true) return new PrefixedUnaryExpression(new NumberLiteral(token.image.toCharArray(),
+                                                        pos,
+                                                        SimpleCharStream.getPosition()),
+                                      OperatorIds.MINUS,
+                                      pos);}
       break;
     case PLUS:
       jj_consume_token(PLUS);
@@ -846,7 +929,11 @@ final Token token;
         jj_consume_token(-1);
         throw new ParseException();
       }
-   {if (true) return "+" + token.image;}
+   {if (true) return new PrefixedUnaryExpression(new NumberLiteral(token.image.toCharArray(),
+                                                        pos,
+                                                        SimpleCharStream.getPosition()),
+                                      OperatorIds.PLUS,
+                                      pos);}
       break;
     case ARRAY:
       expr = ArrayDeclarator();
@@ -854,7 +941,7 @@ final Token token;
       break;
     case IDENTIFIER:
       token = jj_consume_token(IDENTIFIER);
-   {if (true) return token.image;}
+   {if (true) return new ConstantIdentifier(token.image.toCharArray(),pos,SimpleCharStream.getPosition());}
       break;
     default:
       jj_la1[17] = jj_gen;
@@ -864,28 +951,26 @@ final Token token;
     throw new Error("Missing return statement in function");
   }
 
-  static final public String ArrayVariable() throws ParseException {
-String expr;
-final StringBuffer buff = new StringBuffer();
+  static final public ArrayVariableDeclaration ArrayVariable() throws ParseException {
+Expression expr;
+Expression expr2 = null;
     expr = Expression();
-   buff.append(expr);
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case ARRAYASSIGN:
       jj_consume_token(ARRAYASSIGN);
-      expr = Expression();
-    buff.append("=>").append(expr);
+      expr2 = Expression();
       break;
     default:
       jj_la1[18] = jj_gen;
       ;
     }
-   {if (true) return buff.toString();}
+   {if (true) return new ArrayVariableDeclaration(expr,expr2);}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String ArrayInitializer() throws ParseException {
-String expr;
-final StringBuffer buff = new StringBuffer("(");
+  static final public ArrayVariableDeclaration[] ArrayInitializer() throws ParseException {
+  ArrayVariableDeclaration expr;
+  final ArrayList list = new ArrayList();
     jj_consume_token(LPAREN);
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case ARRAY:
@@ -895,11 +980,6 @@ final StringBuffer buff = new StringBuffer("(");
     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:
@@ -908,9 +988,14 @@ final StringBuffer buff = new StringBuffer("(");
     case PLUS:
     case MINUS:
     case BIT_AND:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
     case DOLLAR_ID:
       expr = ArrayVariable();
-             buff.append(expr);
+             list.add(expr);
       label_6:
       while (true) {
         if (jj_2_2(2)) {
@@ -920,7 +1005,7 @@ final StringBuffer buff = new StringBuffer("(");
         }
         jj_consume_token(COMMA);
         expr = ArrayVariable();
-             buff.append(",").append(expr);
+             list.add(expr);
       }
       break;
     default:
@@ -930,15 +1015,14 @@ final StringBuffer buff = new StringBuffer("(");
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case COMMA:
       jj_consume_token(COMMA);
-                     buff.append(",");
+                     list.add(null);
       break;
     default:
       jj_la1[20] = jj_gen;
       ;
     }
     jj_consume_token(RPAREN);
-    buff.append(")");
-    {if (true) return buff.toString();}
+   {if (true) return (ArrayVariableDeclaration[]) list.toArray();}
     throw new Error("Missing return statement in function");
   }
 
@@ -946,13 +1030,14 @@ final StringBuffer buff = new StringBuffer("(");
  * A Method Declaration.
  * <b>function</b> MetodDeclarator() Block()
  */
-  static final public void MethodDeclaration() throws ParseException {
-  final PHPFunctionDeclaration functionDeclaration;
+  static final public MethodDeclaration MethodDeclaration() throws ParseException {
+  final MethodDeclaration functionDeclaration;
   Token functionToken;
+  final Block block;
     functionToken = jj_consume_token(FUNCTION);
     try {
       functionDeclaration = MethodDeclarator();
-     outlineInfo.addVariable(functionDeclaration.getName());
+     outlineInfo.addVariable(new String(functionDeclaration.name));
     } catch (ParseException e) {
     if (errorMessage != null) {
       {if (true) throw e;}
@@ -968,27 +1053,14 @@ final StringBuffer buff = new StringBuffer("(");
       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);
-        }
-      }
-    }
+    block = Block();
+    functionDeclaration.statements = block.statements;
     currentFunction = null;
     if (currentSegment != null) {
-      currentSegment = (PHPSegmentWithChildren) currentSegment.getParent();
+      currentSegment = (OutlineableWithChildren) currentSegment.getParent();
     }
+    {if (true) return functionDeclaration;}
+    throw new Error("Missing return statement in function");
   }
 
 /**
@@ -996,15 +1068,14 @@ final StringBuffer buff = new StringBuffer("(");
  * [&] IDENTIFIER(parameters ...).
  * @return a function description for the outline
  */
-  static final public PHPFunctionDeclaration MethodDeclarator() throws ParseException {
+  static final public MethodDeclaration MethodDeclarator() throws ParseException {
   final Token identifier;
-  final StringBuffer methodDeclaration = new StringBuffer();
+  Token reference = null;
   final Hashtable formalParameters;
-  final int pos = jj_input_stream.getPosition();
+  final int pos = SimpleCharStream.getPosition();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case BIT_AND:
-      jj_consume_token(BIT_AND);
-               methodDeclaration.append("&");
+      reference = jj_consume_token(BIT_AND);
       break;
     default:
       jj_la1[21] = jj_gen;
@@ -1012,8 +1083,12 @@ final StringBuffer buff = new StringBuffer("(");
     }
     identifier = jj_consume_token(IDENTIFIER);
     formalParameters = FormalParameters();
-    methodDeclaration.append(identifier);
-    {if (true) return new PHPFunctionDeclaration(currentSegment,methodDeclaration.toString(),pos,formalParameters);}
+   {if (true) return new MethodDeclaration(currentSegment,
+                                 identifier.image.toCharArray(),
+                                 formalParameters,
+                                 reference != null,
+                                 pos,
+                                 SimpleCharStream.getPosition());}
     throw new Error("Missing return statement in function");
   }
 
@@ -1024,7 +1099,7 @@ final StringBuffer buff = new StringBuffer("(");
   static final public Hashtable FormalParameters() throws ParseException {
   String expr;
   final StringBuffer buff = new StringBuffer("(");
-  PHPVarDeclaration var;
+  VariableDeclaration var;
   final Hashtable parameters = new Hashtable();
     try {
       jj_consume_token(LPAREN);
@@ -1040,7 +1115,7 @@ final StringBuffer buff = new StringBuffer("(");
     case BIT_AND:
     case DOLLAR_ID:
       var = FormalParameter();
-               parameters.put(var.getVariable().getName(),var);
+               parameters.put(new String(var.name),var);
       label_7:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1053,7 +1128,7 @@ final StringBuffer buff = new StringBuffer("(");
         }
         jj_consume_token(COMMA);
         var = FormalParameter();
-                 parameters.put(var.getVariable().getName(),var);
+                 parameters.put(new String(var.name),var);
       }
       break;
     default:
@@ -1077,8 +1152,8 @@ final StringBuffer buff = new StringBuffer("(");
  * A formal parameter.
  * $varname[=value] (,$varname[=value])
  */
-  static final public PHPVarDeclaration FormalParameter() throws ParseException {
-  final PHPVarDeclaration variableDeclaration;
+  static final public VariableDeclaration FormalParameter() throws ParseException {
+  final VariableDeclaration variableDeclaration;
   Token token = null;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case BIT_AND:
@@ -1090,49 +1165,68 @@ final StringBuffer buff = new StringBuffer("(");
     }
     variableDeclaration = VariableDeclarator();
     if (token != null) {
-      variableDeclaration.getVariable().setReference(true);
+      variableDeclaration.setReference(true);
     }
     {if (true) return variableDeclaration;}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String Type() throws ParseException {
+  static final public ConstantIdentifier Type() throws ParseException {
+ final int pos;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case STRING:
       jj_consume_token(STRING);
-             {if (true) return "string";}
+                        pos = SimpleCharStream.getPosition();
+                        {if (true) return new ConstantIdentifier(Types.STRING,
+                                        pos,pos-6);}
       break;
     case BOOL:
       jj_consume_token(BOOL);
-             {if (true) return "bool";}
+                        pos = SimpleCharStream.getPosition();
+                        {if (true) return new ConstantIdentifier(Types.BOOL,
+                                        pos,pos-4);}
       break;
     case BOOLEAN:
       jj_consume_token(BOOLEAN);
-             {if (true) return "boolean";}
+                        pos = SimpleCharStream.getPosition();
+                        {if (true) return new ConstantIdentifier(Types.BOOLEAN,
+                                        pos,pos-7);}
       break;
     case REAL:
       jj_consume_token(REAL);
-             {if (true) return "real";}
+                        pos = SimpleCharStream.getPosition();
+                        {if (true) return new ConstantIdentifier(Types.REAL,
+                                        pos,pos-4);}
       break;
     case DOUBLE:
       jj_consume_token(DOUBLE);
-             {if (true) return "double";}
+                        pos = SimpleCharStream.getPosition();
+                        {if (true) return new ConstantIdentifier(Types.DOUBLE,
+                                        pos,pos-5);}
       break;
     case FLOAT:
       jj_consume_token(FLOAT);
-             {if (true) return "float";}
+                        pos = SimpleCharStream.getPosition();
+                        {if (true) return new ConstantIdentifier(Types.FLOAT,
+                                        pos,pos-5);}
       break;
     case INT:
       jj_consume_token(INT);
-             {if (true) return "int";}
+                        pos = SimpleCharStream.getPosition();
+                        {if (true) return new ConstantIdentifier(Types.INT,
+                                        pos,pos-3);}
       break;
     case INTEGER:
       jj_consume_token(INTEGER);
-             {if (true) return "integer";}
+                        pos = SimpleCharStream.getPosition();
+                        {if (true) return new ConstantIdentifier(Types.INTEGER,
+                                        pos,pos-7);}
       break;
     case OBJECT:
       jj_consume_token(OBJECT);
-             {if (true) return "object";}
+                        pos = SimpleCharStream.getPosition();
+                        {if (true) return new ConstantIdentifier(Types.OBJECT,
+                                        pos,pos-6);}
       break;
     default:
       jj_la1[25] = jj_gen;
@@ -1142,10 +1236,8 @@ final StringBuffer buff = new StringBuffer("(");
     throw new Error("Missing return statement in function");
   }
 
-  static final public String Expression() throws ParseException {
-  final String expr;
-  final String assignOperator;
-  final String expr2;
+  static final public Expression Expression() throws ParseException {
+  final Expression expr;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case PRINT:
       expr = PrintExpression();
@@ -1167,11 +1259,6 @@ final StringBuffer buff = new StringBuffer("(");
         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:
@@ -1180,6 +1267,11 @@ final StringBuffer buff = new StringBuffer("(");
         case PLUS:
         case MINUS:
         case BIT_AND:
+        case INTEGER_LITERAL:
+        case FLOATING_POINT_LITERAL:
+        case STRING_LITERAL:
+        case IDENTIFIER:
+        case LPAREN:
         case DOLLAR_ID:
           expr = ConditionalExpression();
                                   {if (true) return expr;}
@@ -1198,14 +1290,15 @@ final StringBuffer buff = new StringBuffer("(");
  * A Variable assignation.
  * varName (an assign operator) any expression
  */
-  static final public String varAssignation() throws ParseException {
-  String varName,assignOperator,expr2;
-  PHPVarDeclaration variable;
+  static final public VarAssignation varAssignation() throws ParseException {
+  String varName;
+  final Expression expression;
+  final int assignOperator;
   final int pos = SimpleCharStream.getPosition();
     varName = VariableDeclaratorId();
     assignOperator = AssignmentOperator();
     try {
-      expr2 = Expression();
+      expression = Expression();
     } catch (ParseException e) {
       if (errorMessage != null) {
         {if (true) throw e;}
@@ -1216,63 +1309,67 @@ final StringBuffer buff = new StringBuffer("(");
       errorEnd   = jj_input_stream.getPosition() + 1;
       {if (true) throw e;}
     }
-     {if (true) return varName + assignOperator + expr2;}
+     {if (true) return new VarAssignation(varName.toCharArray(),
+                               expression,
+                               assignOperator,
+                               pos,
+                               SimpleCharStream.getPosition());}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String AssignmentOperator() throws ParseException {
+  static final public int AssignmentOperator() throws ParseException {
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case ASSIGN:
       jj_consume_token(ASSIGN);
-                        {if (true) return "=";}
+                        {if (true) return VarAssignation.EQUAL;}
       break;
     case STARASSIGN:
       jj_consume_token(STARASSIGN);
-                        {if (true) return "*=";}
+                        {if (true) return VarAssignation.STAR_EQUAL;}
       break;
     case SLASHASSIGN:
       jj_consume_token(SLASHASSIGN);
-                        {if (true) return "/=";}
+                        {if (true) return VarAssignation.SLASH_EQUAL;}
       break;
     case REMASSIGN:
       jj_consume_token(REMASSIGN);
-                        {if (true) return "%=";}
+                        {if (true) return VarAssignation.REM_EQUAL;}
       break;
     case PLUSASSIGN:
       jj_consume_token(PLUSASSIGN);
-                        {if (true) return "+=";}
+                        {if (true) return VarAssignation.PLUS_EQUAL;}
       break;
     case MINUSASSIGN:
       jj_consume_token(MINUSASSIGN);
-                        {if (true) return "-=";}
+                        {if (true) return VarAssignation.MINUS_EQUAL;}
       break;
     case LSHIFTASSIGN:
       jj_consume_token(LSHIFTASSIGN);
-                        {if (true) return "<<=";}
+                        {if (true) return VarAssignation.LSHIFT_EQUAL;}
       break;
     case RSIGNEDSHIFTASSIGN:
       jj_consume_token(RSIGNEDSHIFTASSIGN);
-                        {if (true) return ">>=";}
+                        {if (true) return VarAssignation.RSIGNEDSHIFT_EQUAL;}
       break;
     case ANDASSIGN:
       jj_consume_token(ANDASSIGN);
-                        {if (true) return "&=";}
+                        {if (true) return VarAssignation.AND_EQUAL;}
       break;
     case XORASSIGN:
       jj_consume_token(XORASSIGN);
-                        {if (true) return "|=";}
+                        {if (true) return VarAssignation.XOR_EQUAL;}
       break;
     case ORASSIGN:
       jj_consume_token(ORASSIGN);
-                        {if (true) return "|=";}
+                        {if (true) return VarAssignation.OR_EQUAL;}
       break;
     case DOTASSIGN:
       jj_consume_token(DOTASSIGN);
-                        {if (true) return ".=";}
+                        {if (true) return VarAssignation.DOT_EQUAL;}
       break;
     case TILDEEQUAL:
       jj_consume_token(TILDEEQUAL);
-                        {if (true) return "~=";}
+                        {if (true) return VarAssignation.TILDE_EQUAL;}
       break;
     default:
       jj_la1[28] = jj_gen;
@@ -1282,10 +1379,10 @@ final StringBuffer buff = new StringBuffer("(");
     throw new Error("Missing return statement in function");
   }
 
-  static final public String ConditionalExpression() throws ParseException {
-  final String expr;
-  String expr2 = null;
-  String expr3 = null;
+  static final public Expression ConditionalExpression() throws ParseException {
+  final Expression expr;
+  Expression expr2 = null;
+  Expression expr3 = null;
     expr = ConditionalOrExpression();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case HOOK:
@@ -1300,23 +1397,20 @@ final StringBuffer buff = new StringBuffer("(");
     }
   if (expr3 == null) {
     {if (true) return expr;}
-  } else {
-    {if (true) return expr + "?" + expr2 + ":" + expr3;}
   }
+  {if (true) return new ConditionalExpression(expr,expr2,expr3);}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String ConditionalOrExpression() throws ParseException {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();
+  static final public Expression ConditionalOrExpression() throws ParseException {
+  Expression expr,expr2;
+  int operator;
     expr = ConditionalAndExpression();
-   buff.append(expr);
     label_8:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case OR_OR:
       case _ORL:
-      case SC_OR:
         ;
         break;
       default:
@@ -1324,36 +1418,35 @@ final StringBuffer buff = new StringBuffer("(");
         break label_8;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case SC_OR:
-        operator = jj_consume_token(SC_OR);
+      case OR_OR:
+        jj_consume_token(OR_OR);
+                 operator = OperatorIds.OR_OR;
         break;
       case _ORL:
-        operator = jj_consume_token(_ORL);
+        jj_consume_token(_ORL);
+                 operator = OperatorIds.ORL;
         break;
       default:
         jj_la1[31] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
-      expr = ConditionalAndExpression();
-      buff.append(operator.image);
-      buff.append(expr);
+      expr2 = ConditionalAndExpression();
+      expr = new BinaryExpression(expr,expr2,operator);
     }
-    {if (true) return buff.toString();}
+   {if (true) return expr;}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String ConditionalAndExpression() throws ParseException {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();
+  static final public Expression ConditionalAndExpression() throws ParseException {
+  Expression expr,expr2;
+  int operator;
     expr = ConcatExpression();
-   buff.append(expr);
     label_9:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case AND_AND:
       case _ANDL:
-      case SC_AND:
         ;
         break;
       default:
@@ -1361,30 +1454,29 @@ final StringBuffer buff = new StringBuffer("(");
         break label_9;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case SC_AND:
-        operator = jj_consume_token(SC_AND);
+      case AND_AND:
+        jj_consume_token(AND_AND);
+                operator = OperatorIds.AND_AND;
         break;
       case _ANDL:
-        operator = jj_consume_token(_ANDL);
+        jj_consume_token(_ANDL);
+                operator = OperatorIds.ANDL;
         break;
       default:
         jj_la1[33] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
-      expr = ConcatExpression();
-      buff.append(operator.image);
-      buff.append(expr);
+      expr2 = ConcatExpression();
+                               expr = new BinaryExpression(expr,expr2,operator);
     }
-   {if (true) return buff.toString();}
+   {if (true) return expr;}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String ConcatExpression() throws ParseException {
-  String expr;
-  final StringBuffer buff = new StringBuffer();
+  static final public Expression ConcatExpression() throws ParseException {
+  Expression expr,expr2;
     expr = InclusiveOrExpression();
-   buff.append(expr);
     label_10:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1396,18 +1488,16 @@ final StringBuffer buff = new StringBuffer("(");
         break label_10;
       }
       jj_consume_token(DOT);
-      expr = InclusiveOrExpression();
-   buff.append(".").append(expr);
+      expr2 = InclusiveOrExpression();
+     expr = new BinaryExpression(expr,expr2,OperatorIds.DOT);
     }
-   {if (true) return buff.toString();}
+   {if (true) return expr;}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String InclusiveOrExpression() throws ParseException {
-  String expr;
-  final StringBuffer buff = new StringBuffer();
+  static final public Expression InclusiveOrExpression() throws ParseException {
+  Expression expr,expr2;
     expr = ExclusiveOrExpression();
-   buff.append(expr);
     label_11:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1419,18 +1509,16 @@ final StringBuffer buff = new StringBuffer("(");
         break label_11;
       }
       jj_consume_token(BIT_OR);
-      expr = ExclusiveOrExpression();
-   buff.append("|").append(expr);
+      expr2 = ExclusiveOrExpression();
+    expr = new BinaryExpression(expr,expr2,OperatorIds.OR);
     }
-   {if (true) return buff.toString();}
+   {if (true) return expr;}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String ExclusiveOrExpression() throws ParseException {
-  String expr;
-  final StringBuffer buff = new StringBuffer();
+  static final public Expression ExclusiveOrExpression() throws ParseException {
+  Expression expr,expr2;
     expr = AndExpression();
-    buff.append(expr);
     label_12:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1442,19 +1530,16 @@ final StringBuffer buff = new StringBuffer("(");
         break label_12;
       }
       jj_consume_token(XOR);
-      expr = AndExpression();
-    buff.append("^");
-    buff.append(expr);
+      expr2 = AndExpression();
+     expr = new BinaryExpression(expr,expr2,OperatorIds.XOR);
     }
-    {if (true) return buff.toString();}
+   {if (true) return expr;}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String AndExpression() throws ParseException {
-  String expr;
-  final StringBuffer buff = new StringBuffer();
+  static final public Expression AndExpression() throws ParseException {
+  Expression expr,expr2;
     expr = EqualityExpression();
-    buff.append(expr);
     label_13:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1466,24 +1551,22 @@ final StringBuffer buff = new StringBuffer("(");
         break label_13;
       }
       jj_consume_token(BIT_AND);
-      expr = EqualityExpression();
-    buff.append("&").append(expr);
+      expr2 = EqualityExpression();
+     expr = new BinaryExpression(expr,expr2,OperatorIds.AND);
     }
-   {if (true) return buff.toString();}
+   {if (true) return expr;}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String EqualityExpression() throws ParseException {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();
+  static final public Expression EqualityExpression() throws ParseException {
+  Expression expr,expr2;
+  int operator;
     expr = RelationalExpression();
-   buff.append(expr);
     label_14:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EQ:
-      case NE:
+      case EQUAL_EQUAL:
+      case NOT_EQUAL:
       case DIF:
       case BANGDOUBLEEQUAL:
       case TRIPLEEQUAL:
@@ -1494,20 +1577,25 @@ final StringBuffer buff = new StringBuffer("(");
         break label_14;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case EQ:
-        operator = jj_consume_token(EQ);
+      case EQUAL_EQUAL:
+        jj_consume_token(EQUAL_EQUAL);
+                          operator = OperatorIds.EQUAL_EQUAL;
         break;
       case DIF:
-        operator = jj_consume_token(DIF);
+        jj_consume_token(DIF);
+                          operator = OperatorIds.DIF;
         break;
-      case NE:
-        operator = jj_consume_token(NE);
+      case NOT_EQUAL:
+        jj_consume_token(NOT_EQUAL);
+                          operator = OperatorIds.DIF;
         break;
       case BANGDOUBLEEQUAL:
-        operator = jj_consume_token(BANGDOUBLEEQUAL);
+        jj_consume_token(BANGDOUBLEEQUAL);
+                          operator = OperatorIds.BANG_EQUAL_EQUAL;
         break;
       case TRIPLEEQUAL:
-        operator = jj_consume_token(TRIPLEEQUAL);
+        jj_consume_token(TRIPLEEQUAL);
+                          operator = OperatorIds.EQUAL_EQUAL_EQUAL;
         break;
       default:
         jj_la1[39] = jj_gen;
@@ -1515,27 +1603,27 @@ final StringBuffer buff = new StringBuffer("(");
         throw new ParseException();
       }
       try {
-        expr = RelationalExpression();
+        expr2 = RelationalExpression();
       } catch (ParseException e) {
-    errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', expression expected after '"+operator.image+"'";
+    if (errorMessage != null) {
+      {if (true) throw e;}
+    }
+    errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', 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;}
       }
-    buff.append(operator.image);
-    buff.append(expr);
+    expr = new BinaryExpression(expr,expr2,operator);
     }
-   {if (true) return buff.toString();}
+   {if (true) return expr;}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String RelationalExpression() throws ParseException {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();
+  static final public Expression RelationalExpression() throws ParseException {
+  Expression expr,expr2;
+  int operator;
     expr = ShiftExpression();
-   buff.append(expr);
     label_15:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1551,35 +1639,37 @@ final StringBuffer buff = new StringBuffer("(");
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case LT:
-        operator = jj_consume_token(LT);
+        jj_consume_token(LT);
+          operator = OperatorIds.LESS;
         break;
       case GT:
-        operator = jj_consume_token(GT);
+        jj_consume_token(GT);
+          operator = OperatorIds.GREATER;
         break;
       case LE:
-        operator = jj_consume_token(LE);
+        jj_consume_token(LE);
+          operator = OperatorIds.LESS_EQUAL;
         break;
       case GE:
-        operator = jj_consume_token(GE);
+        jj_consume_token(GE);
+          operator = OperatorIds.GREATER_EQUAL;
         break;
       default:
         jj_la1[41] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
-      expr = ShiftExpression();
-   buff.append(operator.image).append(expr);
+      expr2 = ShiftExpression();
+   expr = new BinaryExpression(expr,expr2,operator);
     }
-   {if (true) return buff.toString();}
+   {if (true) return expr;}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String ShiftExpression() throws ParseException {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();
+  static final public Expression ShiftExpression() throws ParseException {
+  Expression expr,expr2;
+  int operator;
     expr = AdditiveExpression();
-   buff.append(expr);
     label_16:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1594,33 +1684,33 @@ final StringBuffer buff = new StringBuffer("(");
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case LSHIFT:
-        operator = jj_consume_token(LSHIFT);
+        jj_consume_token(LSHIFT);
+                      operator = OperatorIds.LEFT_SHIFT;
         break;
       case RSIGNEDSHIFT:
-        operator = jj_consume_token(RSIGNEDSHIFT);
+        jj_consume_token(RSIGNEDSHIFT);
+                      operator = OperatorIds.RIGHT_SHIFT;
         break;
       case RUNSIGNEDSHIFT:
-        operator = jj_consume_token(RUNSIGNEDSHIFT);
+        jj_consume_token(RUNSIGNEDSHIFT);
+                      operator = OperatorIds.UNSIGNED_RIGHT_SHIFT;
         break;
       default:
         jj_la1[43] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
-      expr = AdditiveExpression();
-    buff.append(operator.image);
-    buff.append(expr);
+      expr2 = AdditiveExpression();
+   expr = new BinaryExpression(expr,expr2,operator);
     }
-   {if (true) return buff.toString();}
+   {if (true) return expr;}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String AdditiveExpression() throws ParseException {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();
+  static final public Expression AdditiveExpression() throws ParseException {
+  Expression expr,expr2;
+  int operator;
     expr = MultiplicativeExpression();
-   buff.append(expr);
     label_17:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1634,44 +1724,46 @@ final StringBuffer buff = new StringBuffer("(");
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case PLUS:
-        operator = jj_consume_token(PLUS);
+        jj_consume_token(PLUS);
+              operator = OperatorIds.PLUS;
         break;
       case MINUS:
-        operator = jj_consume_token(MINUS);
+        jj_consume_token(MINUS);
+              operator = OperatorIds.MINUS;
         break;
       default:
         jj_la1[45] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
-      expr = MultiplicativeExpression();
-    buff.append(operator.image);
-    buff.append(expr);
+      expr2 = MultiplicativeExpression();
+   expr = new BinaryExpression(expr,expr2,operator);
     }
-   {if (true) return buff.toString();}
+   {if (true) return expr;}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String MultiplicativeExpression() throws ParseException {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();
+  static final public Expression MultiplicativeExpression() throws ParseException {
+  Expression expr,expr2;
+  int operator;
     try {
       expr = UnaryExpression();
     } catch (ParseException e) {
+    if (errorMessage != null) {
+      {if (true) throw e;}
+    }
     errorMessage = "unexpected token '"+e.currentToken.next.image+"'";
     errorLevel   = ERROR;
     errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
-   buff.append(expr);
     label_18:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case STAR:
       case SLASH:
-      case REM:
+      case REMAINDER:
         ;
         break;
       default:
@@ -1680,76 +1772,98 @@ final StringBuffer buff = new StringBuffer("(");
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case STAR:
-        operator = jj_consume_token(STAR);
+        jj_consume_token(STAR);
+                   operator = OperatorIds.MULTIPLY;
         break;
       case SLASH:
-        operator = jj_consume_token(SLASH);
+        jj_consume_token(SLASH);
+                   operator = OperatorIds.DIVIDE;
         break;
-      case REM:
-        operator = jj_consume_token(REM);
+      case REMAINDER:
+        jj_consume_token(REMAINDER);
+                   operator = OperatorIds.REMAINDER;
         break;
       default:
         jj_la1[47] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
-      expr = UnaryExpression();
-      buff.append(operator.image);
-      buff.append(expr);
+      expr2 = UnaryExpression();
+     expr = new BinaryExpression(expr,expr2,operator);
     }
-   {if (true) return buff.toString();}
+   {if (true) return expr;}
     throw new Error("Missing return statement in function");
   }
 
 /**
  * An unary expression starting with @, & or nothing
  */
-  static final public String UnaryExpression() throws ParseException {
-  final String expr;
-  final Token token;
-  final StringBuffer buff = new StringBuffer();
+  static final public Expression UnaryExpression() throws ParseException {
+  Expression expr;
+  final int pos = SimpleCharStream.getPosition();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case BIT_AND:
-      token = jj_consume_token(BIT_AND);
+      jj_consume_token(BIT_AND);
       expr = UnaryExpressionNoPrefix();
-    if (token == null) {
-      {if (true) return expr;}
-    }
-    {if (true) return token.image + expr;}
+   {if (true) return new PrefixedUnaryExpression(expr,OperatorIds.AND,pos);}
       break;
     case ARRAY:
     case NEW:
     case NULL:
     case TRUE:
     case FALSE:
+    case AT:
+    case DOLLAR:
+    case BANG:
+    case INCR:
+    case DECR:
+    case PLUS:
+    case MINUS:
     case INTEGER_LITERAL:
     case FLOATING_POINT_LITERAL:
     case STRING_LITERAL:
     case IDENTIFIER:
     case LPAREN:
+    case DOLLAR_ID:
+      expr = AtUnaryExpression();
+   {if (true) return expr;}
+      break;
+    default:
+      jj_la1[48] = jj_gen;
+      jj_consume_token(-1);
+      throw new ParseException();
+    }
+    throw new Error("Missing return statement in function");
+  }
+
+  static final public Expression AtUnaryExpression() throws ParseException {
+  Expression expr;
+  final int pos = SimpleCharStream.getPosition();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case AT:
+      jj_consume_token(AT);
+      expr = AtUnaryExpression();
+   {if (true) return new PrefixedUnaryExpression(expr,OperatorIds.AT,pos);}
+      break;
+    case ARRAY:
+    case NEW:
+    case NULL:
+    case TRUE:
+    case FALSE:
     case DOLLAR:
     case BANG:
     case INCR:
     case DECR:
     case PLUS:
     case MINUS:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
     case DOLLAR_ID:
-      label_19:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case AT:
-          ;
-          break;
-        default:
-          jj_la1[48] = jj_gen;
-          break label_19;
-        }
-        jj_consume_token(AT);
-         buff.append("@");
-      }
       expr = UnaryExpressionNoPrefix();
-   {if (true) return buff.append(expr).toString();}
+   {if (true) return expr;}
       break;
     default:
       jj_la1[49] = jj_gen;
@@ -1759,18 +1873,21 @@ final StringBuffer buff = new StringBuffer("(");
     throw new Error("Missing return statement in function");
   }
 
-  static final public String UnaryExpressionNoPrefix() throws ParseException {
-  final String expr;
-  final Token token;
+  static final public Expression UnaryExpressionNoPrefix() throws ParseException {
+  Expression expr;
+  int operator;
+  final int pos = SimpleCharStream.getPosition();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case PLUS:
     case MINUS:
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case PLUS:
-        token = jj_consume_token(PLUS);
+        jj_consume_token(PLUS);
+              operator = OperatorIds.PLUS;
         break;
       case MINUS:
-        token = jj_consume_token(MINUS);
+        jj_consume_token(MINUS);
+              operator = OperatorIds.MINUS;
         break;
       default:
         jj_la1[50] = jj_gen;
@@ -1778,7 +1895,7 @@ final StringBuffer buff = new StringBuffer("(");
         throw new ParseException();
       }
       expr = UnaryExpression();
-    {if (true) return token.image + expr;}
+   {if (true) return new PrefixedUnaryExpression(expr,operator,pos);}
       break;
     case INCR:
     case DECR:
@@ -1790,13 +1907,13 @@ final StringBuffer buff = new StringBuffer("(");
     case NULL:
     case TRUE:
     case FALSE:
+    case DOLLAR:
+    case BANG:
     case INTEGER_LITERAL:
     case FLOATING_POINT_LITERAL:
     case STRING_LITERAL:
     case IDENTIFIER:
     case LPAREN:
-    case DOLLAR:
-    case BANG:
     case DOLLAR_ID:
       expr = UnaryExpressionNotPlusMinus();
    {if (true) return expr;}
@@ -1809,15 +1926,18 @@ final StringBuffer buff = new StringBuffer("(");
     throw new Error("Missing return statement in function");
   }
 
-  static final public String PreIncDecExpression() throws ParseException {
-final String expr;
-final Token token;
+  static final public Expression PreIncDecExpression() throws ParseException {
+final Expression expr;
+final int operator;
+  final int pos = SimpleCharStream.getPosition();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case INCR:
-      token = jj_consume_token(INCR);
+      jj_consume_token(INCR);
+             operator = OperatorIds.PLUS_PLUS;
       break;
     case DECR:
-      token = jj_consume_token(DECR);
+      jj_consume_token(DECR);
+             operator = OperatorIds.MINUS_MINUS;
       break;
     default:
       jj_la1[52] = jj_gen;
@@ -1825,17 +1945,18 @@ final Token token;
       throw new ParseException();
     }
     expr = PrimaryExpression();
-   {if (true) return token.image + expr;}
+   {if (true) return new PrefixedUnaryExpression(expr,operator,pos);}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String UnaryExpressionNotPlusMinus() throws ParseException {
-  final String expr;
+  static final public Expression UnaryExpressionNotPlusMinus() throws ParseException {
+  Expression expr;
+  final int pos = SimpleCharStream.getPosition();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case BANG:
       jj_consume_token(BANG);
       expr = UnaryExpression();
-                                   {if (true) return "!" + expr;}
+                                   {if (true) return new PrefixedUnaryExpression(expr,OperatorIds.NOT,pos);}
       break;
     default:
       jj_la1[53] = jj_gen;
@@ -1846,8 +1967,8 @@ final Token token;
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case ARRAY:
         case NEW:
-        case IDENTIFIER:
         case DOLLAR:
+        case IDENTIFIER:
         case DOLLAR_ID:
           expr = PostfixExpression();
                                    {if (true) return expr;}
@@ -1873,7 +1994,7 @@ final Token token;
     errorEnd     = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
           }
-   {if (true) return "("+expr+")";}
+   {if (true) return expr;}
           break;
         default:
           jj_la1[54] = jj_gen;
@@ -1885,8 +2006,10 @@ final Token token;
     throw new Error("Missing return statement in function");
   }
 
-  static final public String CastExpression() throws ParseException {
-final String type, expr;
+  static final public CastExpression CastExpression() throws ParseException {
+final ConstantIdentifier type;
+final Expression expr;
+final int pos = SimpleCharStream.getPosition();
     jj_consume_token(LPAREN);
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case STRING:
@@ -1902,7 +2025,7 @@ final String type, expr;
       break;
     case ARRAY:
       jj_consume_token(ARRAY);
-                                     type = "array";
+             type = new ConstantIdentifier(Types.ARRAY,pos,SimpleCharStream.getPosition());
       break;
     default:
       jj_la1[55] = jj_gen;
@@ -1911,23 +2034,26 @@ final String type, expr;
     }
     jj_consume_token(RPAREN);
     expr = UnaryExpression();
-   {if (true) return "(" + type + ")" + expr;}
+   {if (true) return new CastExpression(type,expr,pos,SimpleCharStream.getPosition());}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String PostfixExpression() throws ParseException {
-  final String expr;
-  Token operator = null;
+  static final public Expression PostfixExpression() throws ParseException {
+  Expression expr;
+  int operator = -1;
+  final int pos = SimpleCharStream.getPosition();
     expr = PrimaryExpression();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case INCR:
     case DECR:
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case INCR:
-        operator = jj_consume_token(INCR);
+        jj_consume_token(INCR);
+            operator = OperatorIds.PLUS_PLUS;
         break;
       case DECR:
-        operator = jj_consume_token(DECR);
+        jj_consume_token(DECR);
+            operator = OperatorIds.MINUS_MINUS;
         break;
       default:
         jj_la1[56] = jj_gen;
@@ -1939,23 +2065,28 @@ final String type, expr;
       jj_la1[57] = jj_gen;
       ;
     }
-    if (operator == null) {
+    if (operator == -1) {
       {if (true) return expr;}
     }
-    {if (true) return expr + operator.image;}
+    {if (true) return new PostfixedUnaryExpression(expr,operator,pos);}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String PrimaryExpression() throws ParseException {
+  static final public Expression PrimaryExpression() throws ParseException {
   final Token identifier;
-  String expr;
+  Expression expr;
   final StringBuffer buff = new StringBuffer();
+  final int pos = SimpleCharStream.getPosition();
     if (jj_2_5(2)) {
       identifier = jj_consume_token(IDENTIFIER);
       jj_consume_token(STATICCLASSACCESS);
       expr = ClassIdentifier();
-   buff.append(identifier.image).append("::").append(expr);
-      label_20:
+   expr = new ClassAccess(new ConstantIdentifier(identifier.image.toCharArray(),
+                                                 pos,
+                                                 SimpleCharStream.getPosition()),
+                          expr,
+                          ClassAccess.STATIC);
+      label_19:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case CLASSACCESS:
@@ -1965,21 +2096,19 @@ final String type, expr;
           break;
         default:
           jj_la1[58] = jj_gen;
-          break label_20;
+          break label_19;
         }
-        expr = PrimarySuffix();
-   buff.append(expr);
+        expr = PrimarySuffix(expr);
       }
-   {if (true) return buff.toString();}
+   {if (true) return expr;}
     } else {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case NEW:
-      case IDENTIFIER:
       case DOLLAR:
+      case IDENTIFIER:
       case DOLLAR_ID:
         expr = PrimaryPrefix();
-                           buff.append(expr);
-        label_21:
+        label_20:
         while (true) {
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
           case CLASSACCESS:
@@ -1989,16 +2118,15 @@ final String type, expr;
             break;
           default:
             jj_la1[59] = jj_gen;
-            break label_21;
+            break label_20;
           }
-          expr = PrimarySuffix();
-                             buff.append(expr);
+          expr = PrimarySuffix(expr);
         }
-   {if (true) return buff.toString();}
+   {if (true) return expr;}
         break;
       case ARRAY:
         expr = ArrayDeclarator();
-   {if (true) return "array" + expr;}
+   {if (true) return expr;}
         break;
       default:
         jj_la1[60] = jj_gen;
@@ -2009,31 +2137,40 @@ final String type, expr;
     throw new Error("Missing return statement in function");
   }
 
-  static final public String ArrayDeclarator() throws ParseException {
-  final String expr;
+  static final public ArrayInitializer ArrayDeclarator() throws ParseException {
+  final ArrayVariableDeclaration[] vars;
+  final int pos = SimpleCharStream.getPosition();
     jj_consume_token(ARRAY);
-    expr = ArrayInitializer();
-   {if (true) return "array" + expr;}
+    vars = ArrayInitializer();
+   {if (true) return new ArrayInitializer(vars,pos,SimpleCharStream.getPosition());}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String PrimaryPrefix() throws ParseException {
-  final String expr;
+  static final public Expression PrimaryPrefix() throws ParseException {
+  final Expression expr;
   final Token token;
+  final String var;
+  final int pos = SimpleCharStream.getPosition();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case IDENTIFIER:
       token = jj_consume_token(IDENTIFIER);
-                                  {if (true) return token.image;}
+                                  {if (true) return new ConstantIdentifier(token.image.toCharArray(),
+                                                                pos,
+                                                                SimpleCharStream.getPosition());}
       break;
     case NEW:
       jj_consume_token(NEW);
       expr = ClassIdentifier();
-                                  {if (true) return "new " + expr;}
+                                  {if (true) return new PrefixedUnaryExpression(expr,
+                                                                     OperatorIds.NEW,
+                                                                     pos);}
       break;
     case DOLLAR:
     case DOLLAR_ID:
-      expr = VariableDeclaratorId();
-                                  {if (true) return expr;}
+      var = VariableDeclaratorId();
+                                 {if (true) return new ConstantIdentifier(var.toCharArray(),
+                                                               pos,
+                                                               SimpleCharStream.getPosition());}
       break;
     default:
       jj_la1[61] = jj_gen;
@@ -2043,41 +2180,52 @@ final String type, expr;
     throw new Error("Missing return statement in function");
   }
 
-  static final public String classInstantiation() throws ParseException {
-  String expr;
-  final StringBuffer buff = new StringBuffer("new ");
+  static final public PrefixedUnaryExpression classInstantiation() throws ParseException {
+  Expression expr;
+  final StringBuffer buff;
+  final int pos = SimpleCharStream.getPosition();
     jj_consume_token(NEW);
     expr = ClassIdentifier();
-   buff.append(expr);
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case ARRAY:
     case NEW:
-    case IDENTIFIER:
     case DOLLAR:
+    case IDENTIFIER:
     case DOLLAR_ID:
+     buff = new StringBuffer(expr.toStringExpression());
       expr = PrimaryExpression();
-     buff.append(expr);
+     buff.append(expr.toStringExpression());
+    expr = new ConstantIdentifier(buff.toString().toCharArray(),
+                                  pos,
+                                  SimpleCharStream.getPosition());
       break;
     default:
       jj_la1[62] = jj_gen;
       ;
     }
-   {if (true) return buff.toString();}
+   {if (true) return new PrefixedUnaryExpression(expr,
+                                      OperatorIds.NEW,
+                                      pos);}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String ClassIdentifier() throws ParseException {
+  static final public ConstantIdentifier ClassIdentifier() throws ParseException {
   final String expr;
   final Token token;
+  final int pos = SimpleCharStream.getPosition();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case IDENTIFIER:
       token = jj_consume_token(IDENTIFIER);
-                                 {if (true) return token.image;}
+                                 {if (true) return new ConstantIdentifier(token.image.toCharArray(),
+                                                               pos,
+                                                               SimpleCharStream.getPosition());}
       break;
     case DOLLAR:
     case DOLLAR_ID:
       expr = VariableDeclaratorId();
-                                 {if (true) return expr;}
+                                 {if (true) return new ConstantIdentifier(expr.toCharArray(),
+                                                               pos,
+                                                               SimpleCharStream.getPosition());}
       break;
     default:
       jj_la1[63] = jj_gen;
@@ -2087,17 +2235,17 @@ final String type, expr;
     throw new Error("Missing return statement in function");
   }
 
-  static final public String PrimarySuffix() throws ParseException {
-  final String expr;
+  static final public AbstractSuffixExpression PrimarySuffix(Expression prefix) throws ParseException {
+  final AbstractSuffixExpression expr;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case LPAREN:
-      expr = Arguments();
-                           {if (true) return expr;}
+      expr = Arguments(prefix);
+                                 {if (true) return expr;}
       break;
     case CLASSACCESS:
     case LBRACKET:
-      expr = VariableSuffix();
-                           {if (true) return expr;}
+      expr = VariableSuffix(prefix);
+                                 {if (true) return expr;}
       break;
     default:
       jj_la1[64] = jj_gen;
@@ -2107,8 +2255,10 @@ final String type, expr;
     throw new Error("Missing return statement in function");
   }
 
-  static final public String VariableSuffix() throws ParseException {
+  static final public AbstractSuffixExpression VariableSuffix(Expression prefix) throws ParseException {
   String expr = null;
+  final int pos = SimpleCharStream.getPosition();
+  Expression expression = null;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case CLASSACCESS:
       jj_consume_token(CLASSACCESS);
@@ -2121,7 +2271,9 @@ final String type, expr;
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
       }
-   {if (true) return "->" + expr;}
+   {if (true) return new ClassAccess(prefix,
+                          new ConstantIdentifier(expr.toCharArray(),pos,SimpleCharStream.getPosition()),
+                          ClassAccess.NORMAL);}
       break;
     case LBRACKET:
       jj_consume_token(LBRACKET);
@@ -2142,11 +2294,6 @@ final String type, expr;
       case FLOAT:
       case INT:
       case INTEGER:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
       case AT:
       case DOLLAR:
       case BANG:
@@ -2155,6 +2302,11 @@ final String type, expr;
       case PLUS:
       case MINUS:
       case BIT_AND:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case IDENTIFIER:
+      case LPAREN:
       case DOLLAR_ID:
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case ARRAY:
@@ -2164,11 +2316,6 @@ final String type, expr;
         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:
@@ -2177,8 +2324,13 @@ final String type, expr;
         case PLUS:
         case MINUS:
         case BIT_AND:
+        case INTEGER_LITERAL:
+        case FLOATING_POINT_LITERAL:
+        case STRING_LITERAL:
+        case IDENTIFIER:
+        case LPAREN:
         case DOLLAR_ID:
-          expr = Expression();
+          expression = Expression();
           break;
         case STRING:
         case OBJECT:
@@ -2189,7 +2341,7 @@ final String type, expr;
         case FLOAT:
         case INT:
         case INTEGER:
-          expr = Type();
+          expression = Type();
           break;
         default:
           jj_la1[65] = jj_gen;
@@ -2210,10 +2362,7 @@ final String type, expr;
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
       }
-    if(expr == null) {
-      {if (true) return "[]";}
-    }
-    {if (true) return "[" + expr + "]";}
+   {if (true) return new ArrayDeclarator(prefix,expression,SimpleCharStream.getPosition());}
       break;
     default:
       jj_la1[67] = jj_gen;
@@ -2223,30 +2372,39 @@ final String type, expr;
     throw new Error("Missing return statement in function");
   }
 
-  static final public String Literal() throws ParseException {
-  final String expr;
+  static final public Literal Literal() throws ParseException {
   final Token token;
+  final int pos;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case INTEGER_LITERAL:
       token = jj_consume_token(INTEGER_LITERAL);
-                                    {if (true) return token.image;}
+                                    pos = SimpleCharStream.getPosition();
+                                    {if (true) return new NumberLiteral(token.image.toCharArray(),pos-token.image.length(),pos);}
       break;
     case FLOATING_POINT_LITERAL:
       token = jj_consume_token(FLOATING_POINT_LITERAL);
-                                    {if (true) return token.image;}
+                                    pos = SimpleCharStream.getPosition();
+                                    {if (true) return new NumberLiteral(token.image.toCharArray(),pos-token.image.length(),pos);}
       break;
     case STRING_LITERAL:
       token = jj_consume_token(STRING_LITERAL);
-                                    {if (true) return token.image;}
+                                    pos = SimpleCharStream.getPosition();
+                                    {if (true) return new StringLiteral(token.image.toCharArray(),pos-token.image.length(),pos);}
       break;
     case TRUE:
+      jj_consume_token(TRUE);
+                                    pos = SimpleCharStream.getPosition();
+                                    {if (true) return new TrueLiteral(pos-4,pos);}
+      break;
     case FALSE:
-      expr = BooleanLiteral();
-                                    {if (true) return expr;}
+      jj_consume_token(FALSE);
+                                    pos = SimpleCharStream.getPosition();
+                                    {if (true) return new FalseLiteral(pos-4,pos);}
       break;
     case NULL:
       jj_consume_token(NULL);
-                                    {if (true) return "null";}
+                                    pos = SimpleCharStream.getPosition();
+                                    {if (true) return new NullLiteral(pos-4,pos);}
       break;
     default:
       jj_la1[68] = jj_gen;
@@ -2256,26 +2414,8 @@ final String type, expr;
     throw new Error("Missing return statement in function");
   }
 
-  static final public String BooleanLiteral() throws ParseException {
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case TRUE:
-      jj_consume_token(TRUE);
-           {if (true) return "true";}
-      break;
-    case FALSE:
-      jj_consume_token(FALSE);
-           {if (true) return "false";}
-      break;
-    default:
-      jj_la1[69] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    throw new Error("Missing return statement in function");
-  }
-
-  static final public String Arguments() throws ParseException {
-String expr = null;
+  static final public FunctionCall Arguments(Expression func) throws ParseException {
+ArgumentDeclaration[] args = null;
     jj_consume_token(LPAREN);
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case ARRAY:
@@ -2285,11 +2425,6 @@ String expr = null;
     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:
@@ -2298,11 +2433,16 @@ String expr = null;
     case PLUS:
     case MINUS:
     case BIT_AND:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
     case DOLLAR_ID:
-      expr = ArgumentList();
+      args = ArgumentList();
       break;
     default:
-      jj_la1[70] = jj_gen;
+      jj_la1[69] = jj_gen;
       ;
     }
     try {
@@ -2314,31 +2454,29 @@ String expr = null;
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
-  if (expr == null) {
-    {if (true) return "()";}
-  }
-  {if (true) return "(" + expr + ")";}
+   {if (true) return new FunctionCall(func,args,SimpleCharStream.getPosition());}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String ArgumentList() throws ParseException {
-String expr;
-final StringBuffer buff = new StringBuffer();
+  static final public ArgumentDeclaration[] ArgumentList() throws ParseException {
+Expression expr;
+final ArrayList list = new ArrayList();
     expr = Expression();
-   buff.append(expr);
-    label_22:
+   list.add(expr);
+    label_21:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case COMMA:
         ;
         break;
       default:
-        jj_la1[71] = jj_gen;
-        break label_22;
+        jj_la1[70] = jj_gen;
+        break label_21;
       }
       jj_consume_token(COMMA);
       try {
         expr = Expression();
+         list.add(expr);
       } catch (ParseException e) {
         errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. An expression expected after a comma in argument list";
         errorLevel   = ERROR;
@@ -2346,18 +2484,19 @@ final StringBuffer buff = new StringBuffer();
         errorEnd     = jj_input_stream.getPosition() + 1;
         {if (true) throw e;}
       }
-     buff.append(",").append(expr);
     }
-    {if (true) return buff.toString();}
+    {if (true) return (ArgumentDeclaration[]) list.toArray();}
     throw new Error("Missing return statement in function");
   }
 
 /**
  * A Statement without break.
  */
-  static final public void StatementNoBreak() throws ParseException {
+  static final public Statement StatementNoBreak() throws ParseException {
+  final Statement statement;
+  Token token = null;
     if (jj_2_6(2)) {
-      Expression();
+      statement = Expression();
       try {
         jj_consume_token(SEMICOLON);
       } catch (ParseException e) {
@@ -2369,24 +2508,28 @@ final StringBuffer buff = new StringBuffer();
       {if (true) throw e;}
     }
       }
+   {if (true) return statement;}
     } else if (jj_2_7(2)) {
-      LabeledStatement();
+      statement = LabeledStatement();
+                                  {if (true) return statement;}
     } else {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case LBRACE:
-        Block();
+        statement = Block();
+                                  {if (true) return statement;}
         break;
       case SEMICOLON:
-        EmptyStatement();
+        statement = EmptyStatement();
+                                  {if (true) return statement;}
         break;
       case ARRAY:
       case NEW:
-      case IDENTIFIER:
       case DOLLAR:
       case INCR:
       case DECR:
+      case IDENTIFIER:
       case DOLLAR_ID:
-        StatementExpression();
+        statement = StatementExpression();
         try {
           jj_consume_token(SEMICOLON);
         } catch (ParseException e) {
@@ -2396,33 +2539,43 @@ final StringBuffer buff = new StringBuffer();
     errorEnd     = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
         }
+   {if (true) return statement;}
         break;
       case SWITCH:
-        SwitchStatement();
+        statement = SwitchStatement();
+                                         {if (true) return statement;}
         break;
       case IF:
-        IfStatement();
+        statement = IfStatement();
+                                         {if (true) return statement;}
         break;
       case WHILE:
-        WhileStatement();
+        statement = WhileStatement();
+                                         {if (true) return statement;}
         break;
       case DO:
-        DoStatement();
+        statement = DoStatement();
+                                         {if (true) return statement;}
         break;
       case FOR:
-        ForStatement();
+        statement = ForStatement();
+                                         {if (true) return statement;}
         break;
       case FOREACH:
-        ForeachStatement();
+        statement = ForeachStatement();
+                                         {if (true) return statement;}
         break;
       case CONTINUE:
-        ContinueStatement();
+        statement = ContinueStatement();
+                                         {if (true) return statement;}
         break;
       case RETURN:
-        ReturnStatement();
+        statement = ReturnStatement();
+                                         {if (true) return statement;}
         break;
       case ECHO:
-        EchoStatement();
+        statement = EchoStatement();
+                                         {if (true) return statement;}
         break;
       case INCLUDE:
       case REQUIRE:
@@ -2431,32 +2584,40 @@ final StringBuffer buff = new StringBuffer();
       case AT:
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case AT:
-          jj_consume_token(AT);
+          token = jj_consume_token(AT);
           break;
         default:
-          jj_la1[72] = jj_gen;
+          jj_la1[71] = jj_gen;
           ;
         }
-        IncludeStatement();
+        statement = IncludeStatement();
+   if (token != null) {
+    ((InclusionStatement)statement).silent = true;
+  }
+  {if (true) return statement;}
         break;
       case STATIC:
-        StaticStatement();
+        statement = StaticStatement();
+                                         {if (true) return statement;}
         break;
       case GLOBAL:
-        GlobalStatement();
+        statement = GlobalStatement();
+                                         {if (true) return statement;}
         break;
       default:
-        jj_la1[73] = jj_gen;
+        jj_la1[72] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
     }
+    throw new Error("Missing return statement in function");
   }
 
 /**
  * A Normal statement.
  */
-  static final public void Statement() throws ParseException {
+  static final public Statement Statement() throws ParseException {
+  final Statement statement;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case IF:
     case ARRAY:
@@ -2480,13 +2641,6 @@ final StringBuffer buff = new StringBuffer();
     case FALSE:
     case WHILE:
     case FOREACH:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case LBRACE:
-    case SEMICOLON:
     case AT:
     case DOLLAR:
     case BANG:
@@ -2495,33 +2649,46 @@ final StringBuffer buff = new StringBuffer();
     case PLUS:
     case MINUS:
     case BIT_AND:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
+    case LBRACE:
+    case SEMICOLON:
     case DOLLAR_ID:
-      StatementNoBreak();
+      statement = StatementNoBreak();
+                                  {if (true) return statement;}
       break;
     case BREAK:
-      BreakStatement();
+      statement = BreakStatement();
+                                  {if (true) return statement;}
       break;
     default:
-      jj_la1[74] = jj_gen;
+      jj_la1[73] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
+    throw new Error("Missing return statement in function");
   }
 
 /**
  * An html block inside a php syntax.
  */
-  static final public void htmlBlock() throws ParseException {
+  static final public HTMLBlock htmlBlock() throws ParseException {
+  final int startIndex = nodePtr;
+  AstNode[] blockNodes;
+  int nbNodes;
     jj_consume_token(PHPEND);
-    label_23:
+    label_22:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case PHPECHOSTART:
         ;
         break;
       default:
-        jj_la1[75] = jj_gen;
-        break label_23;
+        jj_la1[74] = jj_gen;
+        break label_22;
       }
       phpEchoBlock();
     }
@@ -2534,7 +2701,7 @@ final StringBuffer buff = new StringBuffer();
         jj_consume_token(PHPSTARTSHORT);
         break;
       default:
-        jj_la1[76] = jj_gen;
+        jj_la1[75] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -2545,48 +2712,61 @@ final StringBuffer buff = new StringBuffer();
     errorEnd     = jj_input_stream.getPosition();
     {if (true) throw e;}
     }
+  nbNodes = nodePtr-startIndex;
+  blockNodes = new AstNode[nbNodes];
+  System.arraycopy(nodes,startIndex,blockNodes,0,nbNodes);
+  {if (true) return new HTMLBlock(nodes);}
+    throw new Error("Missing return statement in function");
   }
 
 /**
  * An include statement. It's "include" an expression;
  */
-  static final public void IncludeStatement() throws ParseException {
-  final String expr;
+  static final public InclusionStatement IncludeStatement() throws ParseException {
+  final Expression expr;
   final Token token;
+  final int keyword;
   final int pos = jj_input_stream.getPosition();
+  final InclusionStatement inclusionStatement;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case REQUIRE:
-      token = jj_consume_token(REQUIRE);
+      jj_consume_token(REQUIRE);
+                         keyword = InclusionStatement.REQUIRE;
       break;
     case REQUIRE_ONCE:
-      token = jj_consume_token(REQUIRE_ONCE);
+      jj_consume_token(REQUIRE_ONCE);
+                         keyword = InclusionStatement.REQUIRE_ONCE;
       break;
     case INCLUDE:
-      token = jj_consume_token(INCLUDE);
+      jj_consume_token(INCLUDE);
+                         keyword = InclusionStatement.INCLUDE;
       break;
     case INCLUDE_ONCE:
-      token = jj_consume_token(INCLUDE_ONCE);
+      jj_consume_token(INCLUDE_ONCE);
+                         keyword = InclusionStatement.INCLUDE_ONCE;
       break;
     default:
-      jj_la1[77] = jj_gen;
+      jj_la1[76] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
     try {
       expr = Expression();
     } catch (ParseException e) {
-      if (errorMessage != null) {
-        {if (true) throw e;}
-      }
-      errorMessage = "unexpected token '"+ e.currentToken.next.image+"', expression expected";
-      errorLevel   = ERROR;
-      errorStart   = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1;
-      errorEnd     = jj_input_stream.getPosition() + 1;
+    if (errorMessage != null) {
       {if (true) throw e;}
     }
-    if (currentSegment != null) {
-      currentSegment.add(new PHPReqIncDeclaration(currentSegment, token.image,pos,expr));
+    errorMessage = "unexpected token '"+ e.currentToken.next.image+"', 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;}
     }
+   inclusionStatement = new InclusionStatement(currentSegment,
+                                               keyword,
+                                               expr,
+                                               pos);
+   currentSegment.add(inclusionStatement);
     try {
       jj_consume_token(SEMICOLON);
     } catch (ParseException e) {
@@ -2596,19 +2776,24 @@ final StringBuffer buff = new StringBuffer();
     errorEnd     = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
+   {if (true) return inclusionStatement;}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public String PrintExpression() throws ParseException {
-  final String expr;
+  static final public PrintExpression PrintExpression() throws ParseException {
+  final Expression expr;
+  final int pos = SimpleCharStream.getPosition();
     jj_consume_token(PRINT);
     expr = Expression();
-                               {if (true) return "print " + expr;}
+                               {if (true) return new PrintExpression(expr,pos,SimpleCharStream.getPosition());}
     throw new Error("Missing return statement in function");
   }
 
-  static final public String ListExpression() throws ParseException {
-  final StringBuffer buff = new StringBuffer("list(");
-  String expr;
+  static final public ListExpression ListExpression() throws ParseException {
+  String expr = null;
+  Expression expression = null;
+  ArrayList list = new ArrayList();
+  final int pos = SimpleCharStream.getPosition();
     jj_consume_token(LIST);
     try {
       jj_consume_token(LPAREN);
@@ -2623,21 +2808,22 @@ final StringBuffer buff = new StringBuffer();
     case DOLLAR:
     case DOLLAR_ID:
       expr = VariableDeclaratorId();
-     buff.append(expr);
+     list.add(expr);
       break;
     default:
-      jj_la1[78] = jj_gen;
+      jj_la1[77] = jj_gen;
       ;
     }
-    label_24:
+   if (expr == null) list.add(null);
+    label_23:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case COMMA:
         ;
         break;
       default:
-        jj_la1[79] = jj_gen;
-        break label_24;
+        jj_la1[78] = jj_gen;
+        break label_23;
       }
       try {
         jj_consume_token(COMMA);
@@ -2649,9 +2835,8 @@ final StringBuffer buff = new StringBuffer();
       {if (true) throw e;}
       }
       expr = VariableDeclaratorId();
-     buff.append(",").append(expr);
+     list.add(expr);
     }
-   buff.append(")");
     try {
       jj_consume_token(RPAREN);
     } catch (ParseException e) {
@@ -2664,14 +2849,14 @@ final StringBuffer buff = new StringBuffer();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case ASSIGN:
       jj_consume_token(ASSIGN);
-      expr = Expression();
-                                  buff.append("(").append(expr);
+      expression = Expression();
+     {if (true) return new ListExpression((String[]) list.toArray(),expression,pos,SimpleCharStream.getPosition());}
       break;
     default:
-      jj_la1[80] = jj_gen;
+      jj_la1[79] = jj_gen;
       ;
     }
-   {if (true) return buff.toString();}
+   {if (true) return new ListExpression((String[]) list.toArray(),null,pos,SimpleCharStream.getPosition());}
     throw new Error("Missing return statement in function");
   }
 
@@ -2679,24 +2864,30 @@ final StringBuffer buff = new StringBuffer();
  * An echo statement.
  * echo anyexpression (, otherexpression)*
  */
-  static final public void EchoStatement() throws ParseException {
+  static final public EchoStatement EchoStatement() throws ParseException {
+  final ArrayList expressions = new ArrayList();
+  Expression expr;
+  final int pos = SimpleCharStream.getPosition();
     jj_consume_token(ECHO);
-    Expression();
-    label_25:
+    expr = Expression();
+   expressions.add(expr);
+    label_24:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case COMMA:
         ;
         break;
       default:
-        jj_la1[81] = jj_gen;
-        break label_25;
+        jj_la1[80] = jj_gen;
+        break label_24;
       }
       jj_consume_token(COMMA);
-      Expression();
+      expr = Expression();
+     expressions.add(expr);
     }
     try {
       jj_consume_token(SEMICOLON);
+     {if (true) return new EchoStatement((Expression[]) expressions.toArray(),pos);}
     } catch (ParseException e) {
     if (e.currentToken.next.kind != 4) {
       errorMessage = "';' expected after 'echo' statement";
@@ -2706,34 +2897,39 @@ final StringBuffer buff = new StringBuffer();
       {if (true) throw e;}
     }
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void GlobalStatement() throws ParseException {
+  static final public GlobalStatement GlobalStatement() throws ParseException {
    final int pos = jj_input_stream.getPosition();
    String expr;
+   ArrayList vars = new ArrayList();
+   GlobalStatement global;
     jj_consume_token(GLOBAL);
     expr = VariableDeclaratorId();
-     if (currentSegment != null) {
-      currentSegment.add(new PHPGlobalDeclaration(currentSegment, "global",pos,expr));
-    }
-    label_26:
+     vars.add(expr);
+    label_25:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case COMMA:
         ;
         break;
       default:
-        jj_la1[82] = jj_gen;
-        break label_26;
+        jj_la1[81] = jj_gen;
+        break label_25;
       }
       jj_consume_token(COMMA);
       expr = VariableDeclaratorId();
-     if (currentSegment != null) {
-      currentSegment.add(new PHPGlobalDeclaration(currentSegment, "global",pos,expr));
-    }
+     vars.add(expr);
     }
     try {
       jj_consume_token(SEMICOLON);
+     global = new GlobalStatement(currentSegment,
+                                  (String[]) vars.toArray(),
+                                  pos,
+                                  SimpleCharStream.getPosition());
+    currentSegment.add(global);
+    {if (true) return global;}
     } catch (ParseException e) {
     errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. a ';' was expected";
     errorLevel   = ERROR;
@@ -2741,26 +2937,35 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void StaticStatement() throws ParseException {
+  static final public StaticStatement StaticStatement() throws ParseException {
+  final int pos = SimpleCharStream.getPosition();
+  final ArrayList vars = new ArrayList();
+  VariableDeclaration expr;
     jj_consume_token(STATIC);
-    VariableDeclarator();
-    label_27:
+    expr = VariableDeclarator();
+                                        vars.add(new String(expr.name));
+    label_26:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case COMMA:
         ;
         break;
       default:
-        jj_la1[83] = jj_gen;
-        break label_27;
+        jj_la1[82] = jj_gen;
+        break label_26;
       }
       jj_consume_token(COMMA);
-      VariableDeclarator();
+      expr = VariableDeclarator();
+                                        vars.add(new String(expr.name));
     }
     try {
       jj_consume_token(SEMICOLON);
+     {if (true) return new StaticStatement((String[])vars.toArray(),
+                                pos,
+                                SimpleCharStream.getPosition());}
     } catch (ParseException e) {
     errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. a ';' was expected";
     errorLevel   = ERROR;
@@ -2768,15 +2973,29 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void LabeledStatement() throws ParseException {
-    jj_consume_token(IDENTIFIER);
+  static final public LabeledStatement LabeledStatement() throws ParseException {
+  final int pos = SimpleCharStream.getPosition();
+  final Token label;
+  final Statement statement;
+    label = jj_consume_token(IDENTIFIER);
     jj_consume_token(COLON);
-    Statement();
+    statement = Statement();
+   {if (true) return new LabeledStatement(label.image.toCharArray(),statement,pos,SimpleCharStream.getPosition());}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void Block() throws ParseException {
+/**
+ * A Block is
+ * {
+ * statements
+ * }.
+ * @return a block
+ */
+  static final public Block Block() throws ParseException {
+  final int pos = SimpleCharStream.getPosition();
     try {
       jj_consume_token(LBRACE);
     } catch (ParseException e) {
@@ -2786,7 +3005,7 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
-    label_28:
+    label_27:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case PHPEND:
@@ -2815,13 +3034,6 @@ final StringBuffer buff = new StringBuffer();
       case FALSE:
       case WHILE:
       case FOREACH:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
       case AT:
       case DOLLAR:
       case BANG:
@@ -2830,12 +3042,19 @@ final StringBuffer buff = new StringBuffer();
       case PLUS:
       case MINUS:
       case BIT_AND:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case IDENTIFIER:
+      case LPAREN:
+      case LBRACE:
+      case SEMICOLON:
       case DOLLAR_ID:
         ;
         break;
       default:
-        jj_la1[84] = jj_gen;
-        break label_28;
+        jj_la1[83] = jj_gen;
+        break label_27;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case CLASS:
@@ -2863,13 +3082,6 @@ final StringBuffer buff = new StringBuffer();
       case FALSE:
       case WHILE:
       case FOREACH:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
       case AT:
       case DOLLAR:
       case BANG:
@@ -2878,6 +3090,13 @@ final StringBuffer buff = new StringBuffer();
       case PLUS:
       case MINUS:
       case BIT_AND:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case IDENTIFIER:
+      case LPAREN:
+      case LBRACE:
+      case SEMICOLON:
       case DOLLAR_ID:
         BlockStatement();
         break;
@@ -2885,7 +3104,7 @@ final StringBuffer buff = new StringBuffer();
         htmlBlock();
         break;
       default:
-        jj_la1[85] = jj_gen;
+        jj_la1[84] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -2899,9 +3118,11 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void BlockStatement() throws ParseException {
+  static final public Statement BlockStatement() throws ParseException {
+  final Statement statement;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case IF:
     case ARRAY:
@@ -2926,13 +3147,6 @@ final StringBuffer buff = new StringBuffer();
     case FALSE:
     case WHILE:
     case FOREACH:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case LBRACE:
-    case SEMICOLON:
     case AT:
     case DOLLAR:
     case BANG:
@@ -2941,26 +3155,38 @@ final StringBuffer buff = new StringBuffer();
     case PLUS:
     case MINUS:
     case BIT_AND:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
+    case LBRACE:
+    case SEMICOLON:
     case DOLLAR_ID:
-      Statement();
+      statement = Statement();
+                                   {if (true) return statement;}
       break;
     case CLASS:
-      ClassDeclaration();
+      statement = ClassDeclaration();
+                                   {if (true) return statement;}
       break;
     case FUNCTION:
-      MethodDeclaration();
+      statement = MethodDeclaration();
+                                   {if (true) return statement;}
       break;
     default:
-      jj_la1[86] = jj_gen;
+      jj_la1[85] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
+    throw new Error("Missing return statement in function");
   }
 
 /**
  * A Block statement that will not contain any 'break'
  */
-  static final public void BlockStatementNoBreak() throws ParseException {
+  static final public Statement BlockStatementNoBreak() throws ParseException {
+  final Statement statement;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case IF:
     case ARRAY:
@@ -2984,13 +3210,6 @@ final StringBuffer buff = new StringBuffer();
     case FALSE:
     case WHILE:
     case FOREACH:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case LBRACE:
-    case SEMICOLON:
     case AT:
     case DOLLAR:
     case BANG:
@@ -2999,69 +3218,99 @@ final StringBuffer buff = new StringBuffer();
     case PLUS:
     case MINUS:
     case BIT_AND:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
+    case LBRACE:
+    case SEMICOLON:
     case DOLLAR_ID:
-      StatementNoBreak();
+      statement = StatementNoBreak();
+                                   {if (true) return statement;}
       break;
     case CLASS:
-      ClassDeclaration();
+      statement = ClassDeclaration();
+                                   {if (true) return statement;}
       break;
     case FUNCTION:
-      MethodDeclaration();
+      statement = MethodDeclaration();
+                                   {if (true) return statement;}
       break;
     default:
-      jj_la1[87] = jj_gen;
+      jj_la1[86] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void LocalVariableDeclaration() throws ParseException {
-    LocalVariableDeclarator();
-    label_29:
+  static final public VariableDeclaration[] LocalVariableDeclaration() throws ParseException {
+  final ArrayList list = new ArrayList();
+  VariableDeclaration var;
+    var = LocalVariableDeclarator();
+   list.add(var);
+    label_28:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case COMMA:
         ;
         break;
       default:
-        jj_la1[88] = jj_gen;
-        break label_29;
+        jj_la1[87] = jj_gen;
+        break label_28;
       }
       jj_consume_token(COMMA);
-      LocalVariableDeclarator();
+      var = LocalVariableDeclarator();
+                                             list.add(var);
     }
+   {if (true) return (VariableDeclaration[]) list.toArray();}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void LocalVariableDeclarator() throws ParseException {
-    VariableDeclaratorId();
+  static final public VariableDeclaration LocalVariableDeclarator() throws ParseException {
+  final String varName;
+  Expression init = null;
+  final int pos = SimpleCharStream.getPosition();
+    varName = VariableDeclaratorId();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case ASSIGN:
       jj_consume_token(ASSIGN);
-      Expression();
+      init = Expression();
       break;
     default:
-      jj_la1[89] = jj_gen;
+      jj_la1[88] = jj_gen;
       ;
     }
+   {if (true) return new VariableDeclaration(varName.toCharArray(),init,pos);}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void EmptyStatement() throws ParseException {
+  static final public EmptyStatement EmptyStatement() throws ParseException {
+  final int pos;
     jj_consume_token(SEMICOLON);
+   pos = SimpleCharStream.getPosition();
+   {if (true) return new EmptyStatement(pos-1,pos);}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void StatementExpression() throws ParseException {
+  static final public Statement StatementExpression() throws ParseException {
+  Expression expr;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case INCR:
     case DECR:
-      PreIncDecExpression();
+      expr = PreIncDecExpression();
+                                {if (true) return expr;}
       break;
     case ARRAY:
     case NEW:
-    case IDENTIFIER:
     case DOLLAR:
+    case IDENTIFIER:
     case DOLLAR_ID:
-      PrimaryExpression();
+      expr = PrimaryExpression();
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case INCR:
+      case DECR:
       case ASSIGN:
       case PLUSASSIGN:
       case MINUSASSIGN:
@@ -3073,16 +3322,20 @@ final StringBuffer buff = new StringBuffer();
       case DOTASSIGN:
       case REMASSIGN:
       case TILDEEQUAL:
-      case INCR:
-      case DECR:
       case LSHIFTASSIGN:
       case RSIGNEDSHIFTASSIGN:
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case INCR:
           jj_consume_token(INCR);
+            expr = new PostfixedUnaryExpression(expr,
+                                                OperatorIds.PLUS_PLUS,
+                                                SimpleCharStream.getPosition());
           break;
         case DECR:
           jj_consume_token(DECR);
+            expr = new PostfixedUnaryExpression(expr,
+                                                OperatorIds.MINUS_MINUS,
+                                                SimpleCharStream.getPosition());
           break;
         case ASSIGN:
         case PLUSASSIGN:
@@ -3101,25 +3354,28 @@ final StringBuffer buff = new StringBuffer();
           Expression();
           break;
         default:
-          jj_la1[90] = jj_gen;
+          jj_la1[89] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
         break;
       default:
-        jj_la1[91] = jj_gen;
+        jj_la1[90] = jj_gen;
         ;
       }
       break;
     default:
-      jj_la1[92] = jj_gen;
+      jj_la1[91] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void SwitchStatement() throws ParseException {
-  final int pos = jj_input_stream.getPosition();
+  static final public SwitchStatement SwitchStatement() throws ParseException {
+  final Expression variable;
+  final AbstractCase[] cases;
+  final int pos = SimpleCharStream.getPosition();
     jj_consume_token(SWITCH);
     try {
       jj_consume_token(LPAREN);
@@ -3131,7 +3387,7 @@ final StringBuffer buff = new StringBuffer();
     {if (true) throw e;}
     }
     try {
-      Expression();
+      variable = Expression();
     } catch (ParseException e) {
     if (errorMessage != null) {
       {if (true) throw e;}
@@ -3153,21 +3409,25 @@ final StringBuffer buff = new StringBuffer();
     }
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case LBRACE:
-      switchStatementBrace();
+      cases = switchStatementBrace();
       break;
     case COLON:
-      switchStatementColon(pos, pos + 6);
+      cases = switchStatementColon(pos, pos + 6);
       break;
     default:
-      jj_la1[93] = jj_gen;
+      jj_la1[92] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
+   {if (true) return new SwitchStatement(variable,cases,pos,SimpleCharStream.getPosition());}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void switchStatementBrace() throws ParseException {
+  static final public AbstractCase[] switchStatementBrace() throws ParseException {
+  AbstractCase cas;
+  final ArrayList cases = new ArrayList();
     jj_consume_token(LBRACE);
-    label_30:
+    label_29:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case CASE:
@@ -3175,13 +3435,15 @@ final StringBuffer buff = new StringBuffer();
         ;
         break;
       default:
-        jj_la1[94] = jj_gen;
-        break label_30;
+        jj_la1[93] = jj_gen;
+        break label_29;
       }
-      switchLabel0();
+      cas = switchLabel0();
+                         cases.add(cas);
     }
     try {
       jj_consume_token(RBRACE);
+     {if (true) return (AbstractCase[]) cases.toArray();}
     } catch (ParseException e) {
     errorMessage = "'}' expected";
     errorLevel   = ERROR;
@@ -3189,6 +3451,7 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
+    throw new Error("Missing return statement in function");
   }
 
 /**
@@ -3196,7 +3459,9 @@ final StringBuffer buff = new StringBuffer();
  * @param start the begin offset of the switch
  * @param end the end offset of the switch
  */
-  static final public void switchStatementColon(final int start, final int end) throws ParseException {
+  static final public AbstractCase[] switchStatementColon(final int start, final int end) throws ParseException {
+  AbstractCase cas;
+  final ArrayList cases = new ArrayList();
     jj_consume_token(COLON);
    try {
   setMarker(fileToParse,
@@ -3208,7 +3473,7 @@ final StringBuffer buff = new StringBuffer();
   } catch (CoreException e) {
     PHPeclipsePlugin.log(e);
   }
-    label_31:
+    label_30:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case CASE:
@@ -3216,10 +3481,11 @@ final StringBuffer buff = new StringBuffer();
         ;
         break;
       default:
-        jj_la1[95] = jj_gen;
-        break label_31;
+        jj_la1[94] = jj_gen;
+        break label_30;
       }
-      switchLabel0();
+      cas = switchLabel0();
+                          cases.add(cas);
     }
     try {
       jj_consume_token(ENDSWITCH);
@@ -3232,6 +3498,7 @@ final StringBuffer buff = new StringBuffer();
     }
     try {
       jj_consume_token(SEMICOLON);
+     {if (true) return (AbstractCase[]) cases.toArray();}
     } catch (ParseException e) {
     errorMessage = "';' expected after 'endswitch' keyword";
     errorLevel   = ERROR;
@@ -3239,13 +3506,16 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void switchLabel0() throws ParseException {
-  Token breakToken = null;
-  final int line;
-    line = SwitchLabel();
-    label_32:
+  static final public AbstractCase switchLabel0() throws ParseException {
+  final Expression expr;
+  Statement statement;
+  final ArrayList stmts = new ArrayList();
+  final int pos = SimpleCharStream.getPosition();
+    expr = SwitchLabel();
+    label_31:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case PHPEND:
@@ -3273,13 +3543,6 @@ final StringBuffer buff = new StringBuffer();
       case FALSE:
       case WHILE:
       case FOREACH:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
       case AT:
       case DOLLAR:
       case BANG:
@@ -3288,12 +3551,19 @@ final StringBuffer buff = new StringBuffer();
       case PLUS:
       case MINUS:
       case BIT_AND:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case IDENTIFIER:
+      case LPAREN:
+      case LBRACE:
+      case SEMICOLON:
       case DOLLAR_ID:
         ;
         break;
       default:
-        jj_la1[96] = jj_gen;
-        break label_32;
+        jj_la1[95] = jj_gen;
+        break label_31;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case CLASS:
@@ -3320,13 +3590,6 @@ final StringBuffer buff = new StringBuffer();
       case FALSE:
       case WHILE:
       case FOREACH:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
       case AT:
       case DOLLAR:
       case BANG:
@@ -3335,90 +3598,57 @@ final StringBuffer buff = new StringBuffer();
       case PLUS:
       case MINUS:
       case BIT_AND:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case IDENTIFIER:
+      case LPAREN:
+      case LBRACE:
+      case SEMICOLON:
       case DOLLAR_ID:
-        BlockStatementNoBreak();
+        statement = BlockStatementNoBreak();
+                                         stmts.add(statement);
         break;
       case PHPEND:
-        htmlBlock();
+        statement = htmlBlock();
+                                         stmts.add(statement);
         break;
       default:
-        jj_la1[97] = jj_gen;
+        jj_la1[96] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
     }
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case BREAK:
-      breakToken = BreakStatement();
+      statement = BreakStatement();
+                                         stmts.add(statement);
       break;
     default:
-      jj_la1[98] = jj_gen;
+      jj_la1[97] = jj_gen;
       ;
     }
-    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);
-    }
+   if (expr == null) {//it's a default
+    {if (true) return new DefaultCase((Statement[]) stmts.toArray(),pos,SimpleCharStream.getPosition());}
   }
-
-  static final public Token BreakStatement() throws ParseException {
-  final Token token;
-    token = jj_consume_token(BREAK);
-    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:
-      Expression();
-      break;
-    default:
-      jj_la1[99] = jj_gen;
-      ;
-    }
-    try {
-      jj_consume_token(SEMICOLON);
-    } catch (ParseException e) {
-    errorMessage = "';' expected after 'break' keyword";
-    errorLevel   = ERROR;
-    errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1;
-    errorEnd   = jj_input_stream.getPosition() + 1;
-    {if (true) throw e;}
-    }
-   {if (true) return token;}
+  {if (true) return new Case(expr,(Statement[]) stmts.toArray(),pos,SimpleCharStream.getPosition());}
     throw new Error("Missing return statement in function");
   }
 
-  static final public int SwitchLabel() throws ParseException {
+/**
+ * A SwitchLabel.
+ * case Expression() :
+ * default :
+ * @return the if it was a case and null if not
+ */
+  static final public Expression SwitchLabel() throws ParseException {
   final Token token;
+  final Expression expr;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case CASE:
       token = jj_consume_token(CASE);
       try {
-        Expression();
+        expr = Expression();
       } catch (ParseException e) {
     if (errorMessage != null) {if (true) throw e;}
     errorMessage = "expression expected after 'case' keyword";
@@ -3429,6 +3659,7 @@ final StringBuffer buff = new StringBuffer();
       }
       try {
         jj_consume_token(COLON);
+     {if (true) return expr;}
       } catch (ParseException e) {
     errorMessage = "':' expected after case expression";
     errorLevel   = ERROR;
@@ -3436,12 +3667,12 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
       }
-   {if (true) return token.beginLine;}
       break;
     case _DEFAULT:
       token = jj_consume_token(_DEFAULT);
       try {
         jj_consume_token(COLON);
+     {if (true) return null;}
       } catch (ParseException e) {
     errorMessage = "':' expected after 'default' keyword";
     errorLevel   = ERROR;
@@ -3449,25 +3680,73 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
       }
-   {if (true) return token.beginLine;}
       break;
     default:
-      jj_la1[100] = jj_gen;
+      jj_la1[98] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
     throw new Error("Missing return statement in function");
   }
 
-  static final public void IfStatement() throws ParseException {
-  final Token token;
+  static final public Break BreakStatement() throws ParseException {
+  Expression expression = null;
+  final int start = SimpleCharStream.getPosition();
+    jj_consume_token(BREAK);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case ARRAY:
+    case LIST:
+    case PRINT:
+    case NEW:
+    case NULL:
+    case TRUE:
+    case FALSE:
+    case AT:
+    case DOLLAR:
+    case BANG:
+    case INCR:
+    case DECR:
+    case PLUS:
+    case MINUS:
+    case BIT_AND:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
+    case DOLLAR_ID:
+      expression = Expression();
+      break;
+    default:
+      jj_la1[99] = jj_gen;
+      ;
+    }
+    try {
+      jj_consume_token(SEMICOLON);
+    } catch (ParseException e) {
+    errorMessage = "';' expected after 'break' keyword";
+    errorLevel   = ERROR;
+    errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1;
+    errorEnd   = jj_input_stream.getPosition() + 1;
+    {if (true) throw e;}
+    }
+   {if (true) return new Break(expression, start, SimpleCharStream.getPosition());}
+    throw new Error("Missing return statement in function");
+  }
+
+  static final public IfStatement IfStatement() throws ParseException {
   final int pos = jj_input_stream.getPosition();
-    token = jj_consume_token(IF);
-    Condition("if");
-    IfStatement0(pos,pos+token.image.length());
+  Expression condition;
+  IfStatement ifStatement;
+    jj_consume_token(IF);
+    condition = Condition("if");
+    ifStatement = IfStatement0(condition, pos,pos+2);
+   {if (true) return ifStatement;}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void Condition(final String keyword) throws ParseException {
+  static final public Expression Condition(final String keyword) throws ParseException {
+  final Expression condition;
     try {
       jj_consume_token(LPAREN);
     } catch (ParseException e) {
@@ -3477,9 +3756,10 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = errorStart +1;
     processParseException(e);
     }
-    Expression();
+    condition = Expression();
     try {
       jj_consume_token(RPAREN);
+      {if (true) return condition;}
     } catch (ParseException e) {
     errorMessage = "')' expected after " + keyword + " keyword";
     errorLevel   = ERROR;
@@ -3487,13 +3767,20 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void IfStatement0(final int start,final int end) throws ParseException {
+  static final public IfStatement IfStatement0(Expression condition, final int start,final int end) throws ParseException {
+  Statement statement;
+  ElseIf elseifStatement;
+  Else elseStatement = null;
+  ArrayList stmts = new ArrayList();
+  ArrayList elseifs = new ArrayList();
+  int pos = SimpleCharStream.getPosition();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case COLON:
       jj_consume_token(COLON);
-      label_33:
+      label_32:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case PHPEND:
@@ -3520,13 +3807,6 @@ final StringBuffer buff = new StringBuffer();
         case FALSE:
         case WHILE:
         case FOREACH:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case SEMICOLON:
         case AT:
         case DOLLAR:
         case BANG:
@@ -3535,12 +3815,19 @@ final StringBuffer buff = new StringBuffer();
         case PLUS:
         case MINUS:
         case BIT_AND:
+        case INTEGER_LITERAL:
+        case FLOATING_POINT_LITERAL:
+        case STRING_LITERAL:
+        case IDENTIFIER:
+        case LPAREN:
+        case LBRACE:
+        case SEMICOLON:
         case DOLLAR_ID:
           ;
           break;
         default:
-          jj_la1[101] = jj_gen;
-          break label_33;
+          jj_la1[100] = jj_gen;
+          break label_32;
         }
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case IF:
@@ -3566,13 +3853,6 @@ final StringBuffer buff = new StringBuffer();
         case FALSE:
         case WHILE:
         case FOREACH:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case SEMICOLON:
         case AT:
         case DOLLAR:
         case BANG:
@@ -3581,36 +3861,46 @@ final StringBuffer buff = new StringBuffer();
         case PLUS:
         case MINUS:
         case BIT_AND:
+        case INTEGER_LITERAL:
+        case FLOATING_POINT_LITERAL:
+        case STRING_LITERAL:
+        case IDENTIFIER:
+        case LPAREN:
+        case LBRACE:
+        case SEMICOLON:
         case DOLLAR_ID:
-          Statement();
+          statement = Statement();
+                              stmts.add(statement);
           break;
         case PHPEND:
-          htmlBlock();
+          statement = htmlBlock();
+                              stmts.add(statement);
           break;
         default:
-          jj_la1[102] = jj_gen;
+          jj_la1[101] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
       }
-      label_34:
+      label_33:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case ELSEIF:
           ;
           break;
         default:
-          jj_la1[103] = jj_gen;
-          break label_34;
+          jj_la1[102] = jj_gen;
+          break label_33;
         }
-        ElseIfStatementColon();
+        elseifStatement = ElseIfStatementColon();
+                                              elseifs.add(elseifStatement);
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case ELSE:
-        ElseStatementColon();
+        elseStatement = ElseStatementColon();
         break;
       default:
-        jj_la1[104] = jj_gen;
+        jj_la1[103] = jj_gen;
         ;
       }
    try {
@@ -3634,6 +3924,11 @@ final StringBuffer buff = new StringBuffer();
       }
       try {
         jj_consume_token(SEMICOLON);
+     {if (true) return new IfStatement(condition,
+                            (ElseIf[]) elseifs.toArray(),
+                            elseStatement,
+                            pos,
+                            SimpleCharStream.getPosition());}
       } catch (ParseException e) {
     errorMessage = "';' expected after 'endif' keyword";
     errorLevel   = ERROR;
@@ -3666,13 +3961,6 @@ final StringBuffer buff = new StringBuffer();
     case FALSE:
     case WHILE:
     case FOREACH:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case LBRACE:
-    case SEMICOLON:
     case AT:
     case DOLLAR:
     case BANG:
@@ -3681,6 +3969,13 @@ final StringBuffer buff = new StringBuffer();
     case PLUS:
     case MINUS:
     case BIT_AND:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
+    case LBRACE:
+    case SEMICOLON:
     case DOLLAR_ID:
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case IF:
@@ -3706,13 +4001,6 @@ final StringBuffer buff = new StringBuffer();
       case FALSE:
       case WHILE:
       case FOREACH:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
       case AT:
       case DOLLAR:
       case BANG:
@@ -3721,34 +4009,45 @@ final StringBuffer buff = new StringBuffer();
       case PLUS:
       case MINUS:
       case BIT_AND:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case IDENTIFIER:
+      case LPAREN:
+      case LBRACE:
+      case SEMICOLON:
       case DOLLAR_ID:
-        Statement();
+        statement = Statement();
         break;
       case PHPEND:
-        htmlBlock();
+        statement = htmlBlock();
         break;
       default:
-        jj_la1[105] = jj_gen;
+        jj_la1[104] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
-      label_35:
+   stmts.add(statement);
+      label_34:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case ELSEIF:
           ;
           break;
         default:
-          jj_la1[106] = jj_gen;
-          break label_35;
+          jj_la1[105] = jj_gen;
+          break label_34;
         }
-        ElseIfStatement();
+        elseifStatement = ElseIfStatement();
+                                                      elseifs.add(elseifStatement);
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case ELSE:
         jj_consume_token(ELSE);
         try {
-          Statement();
+       pos = SimpleCharStream.getPosition();
+          statement = Statement();
+       elseStatement = new Else(statement,pos,SimpleCharStream.getPosition());
         } catch (ParseException e) {
       if (errorMessage != null) {
         {if (true) throw e;}
@@ -3761,22 +4060,32 @@ final StringBuffer buff = new StringBuffer();
         }
         break;
       default:
-        jj_la1[107] = jj_gen;
+        jj_la1[106] = jj_gen;
         ;
       }
+   {if (true) return new IfStatement(condition,
+                          (ElseIf[]) elseifs.toArray(),
+                          elseStatement,
+                          pos,
+                          SimpleCharStream.getPosition());}
       break;
     default:
-      jj_la1[108] = jj_gen;
+      jj_la1[107] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void ElseIfStatementColon() throws ParseException {
+  static final public ElseIf ElseIfStatementColon() throws ParseException {
+  Expression condition;
+  Statement statement;
+  final ArrayList list = new ArrayList();
+  final int pos = SimpleCharStream.getPosition();
     jj_consume_token(ELSEIF);
-    Condition("elseif");
+    condition = Condition("elseif");
     jj_consume_token(COLON);
-    label_36:
+    label_35:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case PHPEND:
@@ -3803,13 +4112,6 @@ final StringBuffer buff = new StringBuffer();
       case FALSE:
       case WHILE:
       case FOREACH:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
       case AT:
       case DOLLAR:
       case BANG:
@@ -3818,12 +4120,19 @@ final StringBuffer buff = new StringBuffer();
       case PLUS:
       case MINUS:
       case BIT_AND:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case IDENTIFIER:
+      case LPAREN:
+      case LBRACE:
+      case SEMICOLON:
       case DOLLAR_ID:
         ;
         break;
       default:
-        jj_la1[109] = jj_gen;
-        break label_36;
+        jj_la1[108] = jj_gen;
+        break label_35;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case IF:
@@ -3849,13 +4158,6 @@ final StringBuffer buff = new StringBuffer();
       case FALSE:
       case WHILE:
       case FOREACH:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
       case AT:
       case DOLLAR:
       case BANG:
@@ -3864,24 +4166,38 @@ final StringBuffer buff = new StringBuffer();
       case PLUS:
       case MINUS:
       case BIT_AND:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case IDENTIFIER:
+      case LPAREN:
+      case LBRACE:
+      case SEMICOLON:
       case DOLLAR_ID:
-        Statement();
+        statement = Statement();
+                                      list.add(statement);
         break;
       case PHPEND:
-        htmlBlock();
+        statement = htmlBlock();
+                                      list.add(statement);
         break;
       default:
-        jj_la1[110] = jj_gen;
+        jj_la1[109] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
     }
+   {if (true) return new ElseIf(condition,(Statement[]) list.toArray(),pos,SimpleCharStream.getPosition());}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void ElseStatementColon() throws ParseException {
+  static final public Else ElseStatementColon() throws ParseException {
+  Statement statement;
+  final ArrayList list = new ArrayList();
+  final int pos = SimpleCharStream.getPosition();
     jj_consume_token(ELSE);
     jj_consume_token(COLON);
-    label_37:
+    label_36:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case PHPEND:
@@ -3908,13 +4224,6 @@ final StringBuffer buff = new StringBuffer();
       case FALSE:
       case WHILE:
       case FOREACH:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
       case AT:
       case DOLLAR:
       case BANG:
@@ -3923,12 +4232,19 @@ final StringBuffer buff = new StringBuffer();
       case PLUS:
       case MINUS:
       case BIT_AND:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case IDENTIFIER:
+      case LPAREN:
+      case LBRACE:
+      case SEMICOLON:
       case DOLLAR_ID:
         ;
         break;
       default:
-        jj_la1[111] = jj_gen;
-        break label_37;
+        jj_la1[110] = jj_gen;
+        break label_36;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case IF:
@@ -3954,13 +4270,6 @@ final StringBuffer buff = new StringBuffer();
       case FALSE:
       case WHILE:
       case FOREACH:
-      case INTEGER_LITERAL:
-      case FLOATING_POINT_LITERAL:
-      case STRING_LITERAL:
-      case IDENTIFIER:
-      case LPAREN:
-      case LBRACE:
-      case SEMICOLON:
       case AT:
       case DOLLAR:
       case BANG:
@@ -3969,39 +4278,63 @@ final StringBuffer buff = new StringBuffer();
       case PLUS:
       case MINUS:
       case BIT_AND:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case IDENTIFIER:
+      case LPAREN:
+      case LBRACE:
+      case SEMICOLON:
       case DOLLAR_ID:
-        Statement();
+        statement = Statement();
+                                             list.add(statement);
         break;
       case PHPEND:
-        htmlBlock();
+        statement = htmlBlock();
+                                             list.add(statement);
         break;
       default:
-        jj_la1[112] = jj_gen;
+        jj_la1[111] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
     }
+   {if (true) return new Else((Statement[]) list.toArray(),pos,SimpleCharStream.getPosition());}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void ElseIfStatement() throws ParseException {
+  static final public ElseIf ElseIfStatement() throws ParseException {
+  Expression condition;
+  Statement statement;
+  final ArrayList list = new ArrayList();
+  final int pos = SimpleCharStream.getPosition();
     jj_consume_token(ELSEIF);
-    Condition("elseif");
-    Statement();
+    condition = Condition("elseif");
+    statement = Statement();
+                                                                    list.add(statement);/*todo:do better*/
+   {if (true) return new ElseIf(condition,(Statement[]) list.toArray(),pos,SimpleCharStream.getPosition());}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void WhileStatement() throws ParseException {
-  final Token token;
-  final int pos = jj_input_stream.getPosition();
-    token = jj_consume_token(WHILE);
-    Condition("while");
-    WhileStatement0(pos,pos + token.image.length());
+  static final public WhileStatement WhileStatement() throws ParseException {
+  final Expression condition;
+  final Statement action;
+  final int pos = SimpleCharStream.getPosition();
+    jj_consume_token(WHILE);
+    condition = Condition("while");
+    action = WhileStatement0(pos,pos + 5);
+     {if (true) return new WhileStatement(condition,action,pos,SimpleCharStream.getPosition());}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void WhileStatement0(final int start, final int end) throws ParseException {
+  static final public Statement WhileStatement0(final int start, final int end) throws ParseException {
+  Statement statement;
+  final ArrayList stmts = new ArrayList();
+  final int pos = SimpleCharStream.getPosition();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case COLON:
       jj_consume_token(COLON);
-      label_38:
+      label_37:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case IF:
@@ -4027,13 +4360,6 @@ final StringBuffer buff = new StringBuffer();
         case FALSE:
         case WHILE:
         case FOREACH:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case SEMICOLON:
         case AT:
         case DOLLAR:
         case BANG:
@@ -4042,14 +4368,22 @@ final StringBuffer buff = new StringBuffer();
         case PLUS:
         case MINUS:
         case BIT_AND:
+        case INTEGER_LITERAL:
+        case FLOATING_POINT_LITERAL:
+        case STRING_LITERAL:
+        case IDENTIFIER:
+        case LPAREN:
+        case LBRACE:
+        case SEMICOLON:
         case DOLLAR_ID:
           ;
           break;
         default:
-          jj_la1[113] = jj_gen;
-          break label_38;
+          jj_la1[112] = jj_gen;
+          break label_37;
         }
-        Statement();
+        statement = Statement();
+                                    stmts.add(statement);
       }
    try {
   setMarker(fileToParse,
@@ -4072,6 +4406,7 @@ final StringBuffer buff = new StringBuffer();
       }
       try {
         jj_consume_token(SEMICOLON);
+     {if (true) return new Block((Statement[]) stmts.toArray(),pos,SimpleCharStream.getPosition());}
       } catch (ParseException e) {
     errorMessage = "';' expected after 'endwhile' keyword";
     errorLevel   = ERROR;
@@ -4103,13 +4438,6 @@ final StringBuffer buff = new StringBuffer();
     case FALSE:
     case WHILE:
     case FOREACH:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case LBRACE:
-    case SEMICOLON:
     case AT:
     case DOLLAR:
     case BANG:
@@ -4118,23 +4446,36 @@ final StringBuffer buff = new StringBuffer();
     case PLUS:
     case MINUS:
     case BIT_AND:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
+    case LBRACE:
+    case SEMICOLON:
     case DOLLAR_ID:
-      Statement();
+      statement = Statement();
+   {if (true) return statement;}
       break;
     default:
-      jj_la1[114] = jj_gen;
+      jj_la1[113] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void DoStatement() throws ParseException {
+  static final public DoStatement DoStatement() throws ParseException {
+  final Statement action;
+  final Expression condition;
+  final int pos = SimpleCharStream.getPosition();
     jj_consume_token(DO);
-    Statement();
+    action = Statement();
     jj_consume_token(WHILE);
-    Condition("while");
+    condition = Condition("while");
     try {
       jj_consume_token(SEMICOLON);
+     {if (true) return new DoStatement(condition,action,pos,SimpleCharStream.getPosition());}
     } catch (ParseException e) {
     errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected";
     errorLevel   = ERROR;
@@ -4142,9 +4483,15 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void ForeachStatement() throws ParseException {
+  static final public ForeachStatement ForeachStatement() throws ParseException {
+  Statement statement;
+  Expression expression;
+  final StringBuffer buff = new StringBuffer();
+  final int pos = SimpleCharStream.getPosition();
+  ArrayVariableDeclaration variable;
     jj_consume_token(FOREACH);
     try {
       jj_consume_token(LPAREN);
@@ -4156,7 +4503,7 @@ final StringBuffer buff = new StringBuffer();
     {if (true) throw e;}
     }
     try {
-      Variable();
+      expression = Expression();
     } catch (ParseException e) {
     errorMessage = "variable expected";
     errorLevel   = ERROR;
@@ -4164,19 +4511,6 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
-    label_39:
-    while (true) {
-      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CLASSACCESS:
-      case LBRACKET:
-        ;
-        break;
-      default:
-        jj_la1[115] = jj_gen;
-        break label_39;
-      }
-      VariableSuffix();
-    }
     try {
       jj_consume_token(AS);
     } catch (ParseException e) {
@@ -4187,7 +4521,7 @@ final StringBuffer buff = new StringBuffer();
     {if (true) throw e;}
     }
     try {
-      Variable();
+      variable = ArrayVariable();
     } catch (ParseException e) {
     errorMessage = "variable expected";
     errorLevel   = ERROR;
@@ -4195,15 +4529,6 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case ARRAYASSIGN:
-      jj_consume_token(ARRAYASSIGN);
-      Expression();
-      break;
-    default:
-      jj_la1[116] = jj_gen;
-      ;
-    }
     try {
       jj_consume_token(RPAREN);
     } catch (ParseException e) {
@@ -4214,7 +4539,7 @@ final StringBuffer buff = new StringBuffer();
     {if (true) throw e;}
     }
     try {
-      Statement();
+      statement = Statement();
     } catch (ParseException e) {
     if (errorMessage != null) {if (true) throw e;}
     errorMessage = "statement expected";
@@ -4223,11 +4548,23 @@ final StringBuffer buff = new StringBuffer();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
+   {if (true) return new ForeachStatement(expression,
+                               variable,
+                               statement,
+                               pos,
+                               SimpleCharStream.getPosition());}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void ForStatement() throws ParseException {
+  static final public ForStatement ForStatement() throws ParseException {
 final Token token;
-final int pos = jj_input_stream.getPosition();
+final int pos = SimpleCharStream.getPosition();
+Statement[] initializations = null;
+Expression condition = null;
+Statement[] increments = null;
+Statement action;
+final ArrayList list = new ArrayList();
+final int startBlock, endBlock;
     token = jj_consume_token(FOR);
     try {
       jj_consume_token(LPAREN);
@@ -4241,15 +4578,15 @@ final int pos = jj_input_stream.getPosition();
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case ARRAY:
     case NEW:
-    case IDENTIFIER:
     case DOLLAR:
     case INCR:
     case DECR:
+    case IDENTIFIER:
     case DOLLAR_ID:
-      ForInit();
+      initializations = ForInit();
       break;
     default:
-      jj_la1[117] = jj_gen;
+      jj_la1[114] = jj_gen;
       ;
     }
     jj_consume_token(SEMICOLON);
@@ -4261,11 +4598,6 @@ final int pos = jj_input_stream.getPosition();
     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:
@@ -4274,26 +4606,31 @@ final int pos = jj_input_stream.getPosition();
     case PLUS:
     case MINUS:
     case BIT_AND:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
     case DOLLAR_ID:
-      Expression();
+      condition = Expression();
       break;
     default:
-      jj_la1[118] = jj_gen;
+      jj_la1[115] = jj_gen;
       ;
     }
     jj_consume_token(SEMICOLON);
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case ARRAY:
     case NEW:
-    case IDENTIFIER:
     case DOLLAR:
     case INCR:
     case DECR:
+    case IDENTIFIER:
     case DOLLAR_ID:
-      StatementExpressionList();
+      increments = StatementExpressionList();
       break;
     default:
-      jj_la1[119] = jj_gen;
+      jj_la1[116] = jj_gen;
       ;
     }
     jj_consume_token(RPAREN);
@@ -4321,13 +4658,6 @@ final int pos = jj_input_stream.getPosition();
     case FALSE:
     case WHILE:
     case FOREACH:
-    case INTEGER_LITERAL:
-    case FLOATING_POINT_LITERAL:
-    case STRING_LITERAL:
-    case IDENTIFIER:
-    case LPAREN:
-    case LBRACE:
-    case SEMICOLON:
     case AT:
     case DOLLAR:
     case BANG:
@@ -4336,12 +4666,21 @@ final int pos = jj_input_stream.getPosition();
     case PLUS:
     case MINUS:
     case BIT_AND:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
+    case LBRACE:
+    case SEMICOLON:
     case DOLLAR_ID:
-      Statement();
+      action = Statement();
+       {if (true) return new ForStatement(initializations,condition,increments,action,pos,SimpleCharStream.getPosition());}
       break;
     case COLON:
       jj_consume_token(COLON);
-      label_40:
+       startBlock = SimpleCharStream.getPosition();
+      label_38:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case IF:
@@ -4367,13 +4706,6 @@ final int pos = jj_input_stream.getPosition();
         case FALSE:
         case WHILE:
         case FOREACH:
-        case INTEGER_LITERAL:
-        case FLOATING_POINT_LITERAL:
-        case STRING_LITERAL:
-        case IDENTIFIER:
-        case LPAREN:
-        case LBRACE:
-        case SEMICOLON:
         case AT:
         case DOLLAR:
         case BANG:
@@ -4382,14 +4714,22 @@ final int pos = jj_input_stream.getPosition();
         case PLUS:
         case MINUS:
         case BIT_AND:
+        case INTEGER_LITERAL:
+        case FLOATING_POINT_LITERAL:
+        case STRING_LITERAL:
+        case IDENTIFIER:
+        case LPAREN:
+        case LBRACE:
+        case SEMICOLON:
         case DOLLAR_ID:
           ;
           break;
         default:
-          jj_la1[120] = jj_gen;
-          break label_40;
+          jj_la1[117] = jj_gen;
+          break label_38;
         }
-        Statement();
+        action = Statement();
+                             list.add(action);
       }
         try {
         setMarker(fileToParse,
@@ -4401,6 +4741,7 @@ final int pos = jj_input_stream.getPosition();
         } catch (CoreException e) {
           PHPeclipsePlugin.log(e);
         }
+       endBlock = SimpleCharStream.getPosition();
       try {
         jj_consume_token(ENDFOR);
       } catch (ParseException e) {
@@ -4412,6 +4753,7 @@ final int pos = jj_input_stream.getPosition();
       }
       try {
         jj_consume_token(SEMICOLON);
+         {if (true) return new ForStatement(initializations,condition,increments,new Block((Statement[])list.toArray(),startBlock,endBlock),pos,SimpleCharStream.getPosition());}
       } catch (ParseException e) {
         errorMessage = "';' expected after 'endfor' keyword";
         errorLevel   = ERROR;
@@ -4421,52 +4763,65 @@ final int pos = jj_input_stream.getPosition();
       }
       break;
     default:
-      jj_la1[121] = jj_gen;
+      jj_la1[118] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void ForInit() throws ParseException {
+  static final public Statement[] ForInit() throws ParseException {
+  Statement[] statements;
     if (jj_2_8(2147483647)) {
-      LocalVariableDeclaration();
+      statements = LocalVariableDeclaration();
+   {if (true) return statements;}
     } else {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case ARRAY:
       case NEW:
-      case IDENTIFIER:
       case DOLLAR:
       case INCR:
       case DECR:
+      case IDENTIFIER:
       case DOLLAR_ID:
-        StatementExpressionList();
+        statements = StatementExpressionList();
+   {if (true) return statements;}
         break;
       default:
-        jj_la1[122] = jj_gen;
+        jj_la1[119] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void StatementExpressionList() throws ParseException {
-    StatementExpression();
-    label_41:
+  static final public Statement[] StatementExpressionList() throws ParseException {
+  final ArrayList list = new ArrayList();
+  Statement expr;
+    expr = StatementExpression();
+                                  list.add(expr);
+    label_39:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case COMMA:
         ;
         break;
       default:
-        jj_la1[123] = jj_gen;
-        break label_41;
+        jj_la1[120] = jj_gen;
+        break label_39;
       }
       jj_consume_token(COMMA);
       StatementExpression();
+                                  list.add(expr);
     }
+   {if (true) return (Statement[]) list.toArray();}
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void ContinueStatement() throws ParseException {
+  static final public Continue ContinueStatement() throws ParseException {
+  Expression expr = null;
+  final int pos = SimpleCharStream.getPosition();
     jj_consume_token(CONTINUE);
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case ARRAY:
@@ -4476,11 +4831,6 @@ final int pos = jj_input_stream.getPosition();
     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:
@@ -4489,15 +4839,21 @@ final int pos = jj_input_stream.getPosition();
     case PLUS:
     case MINUS:
     case BIT_AND:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
     case DOLLAR_ID:
-      Expression();
+      expr = Expression();
       break;
     default:
-      jj_la1[124] = jj_gen;
+      jj_la1[121] = jj_gen;
       ;
     }
     try {
       jj_consume_token(SEMICOLON);
+     {if (true) return new Continue(expr,pos,SimpleCharStream.getPosition());}
     } catch (ParseException e) {
     errorMessage = "';' expected after 'continue' statement";
     errorLevel   = ERROR;
@@ -4505,9 +4861,12 @@ final int pos = jj_input_stream.getPosition();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
+    throw new Error("Missing return statement in function");
   }
 
-  static final public void ReturnStatement() throws ParseException {
+  static final public ReturnStatement ReturnStatement() throws ParseException {
+  Expression expr = null;
+  final int pos = SimpleCharStream.getPosition();
     jj_consume_token(RETURN);
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case ARRAY:
@@ -4517,11 +4876,6 @@ final int pos = jj_input_stream.getPosition();
     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:
@@ -4530,15 +4884,21 @@ final int pos = jj_input_stream.getPosition();
     case PLUS:
     case MINUS:
     case BIT_AND:
+    case INTEGER_LITERAL:
+    case FLOATING_POINT_LITERAL:
+    case STRING_LITERAL:
+    case IDENTIFIER:
+    case LPAREN:
     case DOLLAR_ID:
-      Expression();
+      expr = Expression();
       break;
     default:
-      jj_la1[125] = jj_gen;
+      jj_la1[122] = jj_gen;
       ;
     }
     try {
       jj_consume_token(SEMICOLON);
+     {if (true) return new ReturnStatement(expr,pos,SimpleCharStream.getPosition());}
     } catch (ParseException e) {
     errorMessage = "';' expected after 'return' statement";
     errorLevel   = ERROR;
@@ -4546,6 +4906,7 @@ final int pos = jj_input_stream.getPosition();
     errorEnd   = jj_input_stream.getPosition() + 1;
     {if (true) throw e;}
     }
+    throw new Error("Missing return statement in function");
   }
 
   static final private boolean jj_2_1(int xla) {
@@ -4604,1557 +4965,1556 @@ final int pos = jj_input_stream.getPosition();
     return retval;
   }
 
-  static final private boolean jj_3R_189() {
+  static final private boolean jj_3R_160() {
+    if (jj_scan_token(DECR)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    return false;
+  }
+
+  static final private boolean jj_3R_159() {
     if (jj_scan_token(INCR)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_181() {
+  static final private boolean jj_3R_157() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_189()) {
+    if (jj_3R_159()) {
     jj_scanpos = xsp;
-    if (jj_3R_190()) return true;
+    if (jj_3R_160()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_166()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_171() {
-    if (jj_3R_178()) return true;
+  static final private boolean jj_3R_152() {
+    if (jj_3R_158()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_184() {
-    if (jj_3R_193()) return true;
+  static final private boolean jj_3R_151() {
+    if (jj_3R_157()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_170() {
-    if (jj_3R_177()) return true;
+  static final private boolean jj_3R_156() {
+    if (jj_scan_token(MINUS)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_184()) { jj_scanpos = xsp; break; }
-      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    }
     return false;
   }
 
-  static final private boolean jj_3R_183() {
-    if (jj_3R_193()) return true;
+  static final private boolean jj_3R_155() {
+    if (jj_scan_token(PLUS)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_44() {
-    if (jj_3R_52()) return true;
+  static final private boolean jj_3R_148() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_150()) {
+    jj_scanpos = xsp;
+    if (jj_3R_151()) {
+    jj_scanpos = xsp;
+    if (jj_3R_152()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_53()) return true;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    return false;
+  }
+
+  static final private boolean jj_3R_150() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_155()) {
+    jj_scanpos = xsp;
+    if (jj_3R_156()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_47()) return true;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_139()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_180() {
-    if (jj_scan_token(ARRAY)) return true;
+  static final private boolean jj_3R_154() {
+    if (jj_3R_148()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3_5() {
-    if (jj_scan_token(IDENTIFIER)) return true;
+  static final private boolean jj_3R_149() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_153()) {
+    jj_scanpos = xsp;
+    if (jj_3R_154()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_scan_token(STATICCLASSACCESS)) return true;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    return false;
+  }
+
+  static final private boolean jj_3R_153() {
+    if (jj_scan_token(AT)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_182()) return true;
+    if (jj_3R_149()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_183()) { jj_scanpos = xsp; break; }
-      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    }
     return false;
   }
 
-  static final private boolean jj_3R_166() {
+  static final private boolean jj_3R_144() {
+    if (jj_3R_149()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    return false;
+  }
+
+  static final private boolean jj_3R_139() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3_5()) {
-    jj_scanpos = xsp;
-    if (jj_3R_170()) {
+    if (jj_3R_143()) {
     jj_scanpos = xsp;
-    if (jj_3R_171()) return true;
+    if (jj_3R_144()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3_3() {
-    if (jj_3R_44()) return true;
+  static final private boolean jj_3R_143() {
+    if (jj_scan_token(BIT_AND)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3R_58() {
-    if (jj_3R_88()) return true;
+    if (jj_3R_148()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_57() {
-    if (jj_3R_44()) return true;
+  static final private boolean jj_3R_147() {
+    if (jj_scan_token(REMAINDER)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_56() {
-    if (jj_3R_87()) return true;
+  static final private boolean jj_3R_146() {
+    if (jj_scan_token(SLASH)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_179() {
-    if (jj_3R_54()) return true;
+  static final private boolean jj_3R_145() {
+    if (jj_scan_token(STAR)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_47() {
+  static final private boolean jj_3R_140() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_55()) {
-    jj_scanpos = xsp;
-    if (jj_3R_56()) {
+    if (jj_3R_145()) {
     jj_scanpos = xsp;
-    if (jj_3R_57()) {
+    if (jj_3R_146()) {
     jj_scanpos = xsp;
-    if (jj_3R_58()) return true;
+    if (jj_3R_147()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3R_55() {
-    if (jj_3R_86()) return true;
+    if (jj_3R_139()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_168() {
-    if (jj_3R_166()) return true;
+  static final private boolean jj_3R_134() {
+    if (jj_3R_139()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_181()) jj_scanpos = xsp;
-    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_140()) { jj_scanpos = xsp; break; }
+      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    }
     return false;
   }
 
-  static final private boolean jj_3R_46() {
-    if (jj_scan_token(ARRAY)) return true;
+  static final private boolean jj_3R_142() {
+    if (jj_scan_token(MINUS)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_85() {
-    if (jj_scan_token(OBJECT)) return true;
+  static final private boolean jj_3R_141() {
+    if (jj_scan_token(PLUS)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_167() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+  static final private boolean jj_3R_135() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_179()) {
+    if (jj_3R_141()) {
     jj_scanpos = xsp;
-    if (jj_3R_180()) return true;
+    if (jj_3R_142()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_scan_token(RPAREN)) return true;
+    if (jj_3R_134()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_141()) return true;
+    return false;
+  }
+
+  static final private boolean jj_3R_128() {
+    if (jj_3R_134()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_135()) { jj_scanpos = xsp; break; }
+      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    }
     return false;
   }
 
-  static final private boolean jj_3R_84() {
-    if (jj_scan_token(INTEGER)) return true;
+  static final private boolean jj_3R_87() {
+    if (jj_scan_token(ASSIGN)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_45()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_45() {
-    if (jj_3R_54()) return true;
+  static final private boolean jj_3R_198() {
+    if (jj_scan_token(COMMA)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_83() {
-    if (jj_scan_token(INT)) return true;
+  static final private boolean jj_3_7() {
+    if (jj_3R_46()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_82() {
-    if (jj_scan_token(FLOAT)) return true;
+  static final private boolean jj_3_2() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_41()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_81() {
-    if (jj_scan_token(DOUBLE)) return true;
+  static final private boolean jj_3R_138() {
+    if (jj_scan_token(RUNSIGNEDSHIFT)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_80() {
-    if (jj_scan_token(REAL)) return true;
+  static final private boolean jj_3R_201() {
+    if (jj_scan_token(ARRAYASSIGN)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_45()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_79() {
-    if (jj_scan_token(BOOLEAN)) return true;
+  static final private boolean jj_3R_197() {
+    if (jj_3R_41()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3_2()) { jj_scanpos = xsp; break; }
+      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    }
     return false;
   }
 
-  static final private boolean jj_3R_78() {
-    if (jj_scan_token(BOOL)) return true;
+  static final private boolean jj_3R_137() {
+    if (jj_scan_token(RSIGNEDSHIFT)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_77() {
-    if (jj_scan_token(STRING)) return true;
+  static final private boolean jj_3R_136() {
+    if (jj_scan_token(LSHIFT)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_54() {
+  static final private boolean jj_3R_129() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_77()) {
-    jj_scanpos = xsp;
-    if (jj_3R_78()) {
-    jj_scanpos = xsp;
-    if (jj_3R_79()) {
-    jj_scanpos = xsp;
-    if (jj_3R_80()) {
-    jj_scanpos = xsp;
-    if (jj_3R_81()) {
-    jj_scanpos = xsp;
-    if (jj_3R_82()) {
+    if (jj_3R_136()) {
     jj_scanpos = xsp;
-    if (jj_3R_83()) {
+    if (jj_3R_137()) {
     jj_scanpos = xsp;
-    if (jj_3R_84()) {
-    jj_scanpos = xsp;
-    if (jj_3R_85()) return true;
+    if (jj_3R_138()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_128()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3_4() {
-    if (jj_scan_token(LPAREN)) return true;
+  static final private boolean jj_3R_121() {
+    if (jj_3R_128()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_45()) {
-    jj_scanpos = xsp;
-    if (jj_3R_46()) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_scan_token(RPAREN)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_129()) { jj_scanpos = xsp; break; }
+      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    }
     return false;
   }
 
-  static final private boolean jj_3R_160() {
-    if (jj_scan_token(DECR)) return true;
+  static final private boolean jj_3_6() {
+    if (jj_3R_45()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_scan_token(SEMICOLON)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_103() {
-    if (jj_scan_token(ASSIGN)) return true;
+  static final private boolean jj_3R_192() {
+    if (jj_scan_token(LPAREN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_47()) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_197()) jj_scanpos = xsp;
+    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    xsp = jj_scanpos;
+    if (jj_3R_198()) jj_scanpos = xsp;
+    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_scan_token(RPAREN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_165() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_47()) return true;
+  static final private boolean jj_3R_133() {
+    if (jj_scan_token(GE)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_scan_token(RPAREN)) return true;
+    return false;
+  }
+
+  static final private boolean jj_3R_132() {
+    if (jj_scan_token(LE)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_164() {
-    if (jj_3R_169()) return true;
+  static final private boolean jj_3R_131() {
+    if (jj_scan_token(GT)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_163() {
-    if (jj_3R_168()) return true;
+  static final private boolean jj_3R_130() {
+    if (jj_scan_token(LT)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_162() {
-    if (jj_3R_167()) return true;
+  static final private boolean jj_3R_41() {
+    if (jj_3R_45()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_201()) jj_scanpos = xsp;
+    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_158() {
+  static final private boolean jj_3R_122() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_161()) {
+    if (jj_3R_130()) {
     jj_scanpos = xsp;
-    if (jj_3R_162()) {
-    jj_scanpos = xsp;
-    if (jj_3R_163()) {
+    if (jj_3R_131()) {
     jj_scanpos = xsp;
-    if (jj_3R_164()) {
+    if (jj_3R_132()) {
     jj_scanpos = xsp;
-    if (jj_3R_165()) return true;
+    if (jj_3R_133()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_121()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_161() {
-    if (jj_scan_token(BANG)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_141()) return true;
+  static final private boolean jj_3R_119() {
+    if (jj_3R_121()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_122()) { jj_scanpos = xsp; break; }
+      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    }
     return false;
   }
 
-  static final private boolean jj_3R_159() {
-    if (jj_scan_token(INCR)) return true;
+  static final private boolean jj_3R_57() {
+    if (jj_3R_50()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_87()) jj_scanpos = xsp;
+    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_156() {
-    if (jj_scan_token(MINUS)) return true;
+  static final private boolean jj_3R_203() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_45()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_157() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_159()) {
-    jj_scanpos = xsp;
-    if (jj_3R_160()) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_166()) return true;
+  static final private boolean jj_3R_202() {
+    if (jj_3R_45()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_203()) { jj_scanpos = xsp; break; }
+      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    }
     return false;
   }
 
-  static final private boolean jj_3R_102() {
+  static final private boolean jj_3R_58() {
     if (jj_scan_token(COMMA)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_52()) return true;
+    if (jj_3R_57()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_101() {
-    if (jj_3R_52()) return true;
+  static final private boolean jj_3R_47() {
+    if (jj_3R_57()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_58()) { jj_scanpos = xsp; break; }
+      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    }
     return false;
   }
 
-  static final private boolean jj_3R_149() {
-    if (jj_scan_token(REM)) return true;
+  static final private boolean jj_3R_200() {
+    if (jj_3R_202()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_154() {
-    if (jj_3R_158()) return true;
+  static final private boolean jj_3R_127() {
+    if (jj_scan_token(TRIPLEEQUAL)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_153() {
-    if (jj_3R_157()) return true;
+  static final private boolean jj_3R_126() {
+    if (jj_scan_token(BANGDOUBLEEQUAL)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_155() {
-    if (jj_scan_token(PLUS)) return true;
+  static final private boolean jj_3R_125() {
+    if (jj_scan_token(NOT_EQUAL)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_150() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_152()) {
-    jj_scanpos = xsp;
-    if (jj_3R_153()) {
-    jj_scanpos = xsp;
-    if (jj_3R_154()) return true;
+  static final private boolean jj_3R_124() {
+    if (jj_scan_token(DIF)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_152() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_155()) {
-    jj_scanpos = xsp;
-    if (jj_3R_156()) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_141()) return true;
+  static final private boolean jj_3R_123() {
+    if (jj_scan_token(EQUAL_EQUAL)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_87() {
-    if (jj_scan_token(LIST)) return true;
+  static final private boolean jj_3R_93() {
+    if (jj_3R_52()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    return false;
+  }
+
+  static final private boolean jj_3R_199() {
     if (jj_scan_token(LPAREN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_101()) jj_scanpos = xsp;
+    if (jj_3R_200()) jj_scanpos = xsp;
     else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_102()) { jj_scanpos = xsp; break; }
-      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    }
     if (jj_scan_token(RPAREN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    xsp = jj_scanpos;
-    if (jj_3R_103()) jj_scanpos = xsp;
-    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_151() {
-    if (jj_scan_token(AT)) return true;
+  static final private boolean jj_3R_120() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_123()) {
+    jj_scanpos = xsp;
+    if (jj_3R_124()) {
+    jj_scanpos = xsp;
+    if (jj_3R_125()) {
+    jj_scanpos = xsp;
+    if (jj_3R_126()) {
+    jj_scanpos = xsp;
+    if (jj_3R_127()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_119()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_146() {
+  static final private boolean jj_3R_117() {
+    if (jj_3R_119()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_151()) { jj_scanpos = xsp; break; }
+      if (jj_3R_120()) { jj_scanpos = xsp; break; }
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     }
-    if (jj_3R_150()) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_86() {
-    if (jj_scan_token(PRINT)) return true;
+  static final private boolean jj_3R_108() {
+    if (jj_scan_token(LBRACE)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_47()) return true;
+    if (jj_3R_45()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3R_148() {
-    if (jj_scan_token(SLASH)) return true;
+    if (jj_scan_token(RBRACE)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_141() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_145()) {
-    jj_scanpos = xsp;
-    if (jj_3R_146()) return true;
+  static final private boolean jj_3R_91() {
+    if (jj_scan_token(DOLLAR_ID)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_145() {
-    if (jj_scan_token(BIT_AND)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_150()) return true;
+  static final private boolean jj_3R_177() {
+    if (jj_scan_token(NULL)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_140() {
-    if (jj_scan_token(RUNSIGNEDSHIFT)) return true;
+  static final private boolean jj_3R_176() {
+    if (jj_scan_token(FALSE)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_147() {
-    if (jj_scan_token(STAR)) return true;
+  static final private boolean jj_3R_118() {
+    if (jj_scan_token(BIT_AND)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_117()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_142() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_147()) {
-    jj_scanpos = xsp;
-    if (jj_3R_148()) {
-    jj_scanpos = xsp;
-    if (jj_3R_149()) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_141()) return true;
+  static final private boolean jj_3R_175() {
+    if (jj_scan_token(TRUE)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_144() {
-    if (jj_scan_token(MINUS)) return true;
+  static final private boolean jj_3R_90() {
+    if (jj_scan_token(DOLLAR)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_59()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_135() {
-    if (jj_scan_token(GE)) return true;
+  static final private boolean jj_3R_174() {
+    if (jj_scan_token(STRING_LITERAL)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_136() {
-    if (jj_3R_141()) return true;
+  static final private boolean jj_3R_115() {
+    if (jj_3R_117()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_142()) { jj_scanpos = xsp; break; }
+      if (jj_3R_118()) { jj_scanpos = xsp; break; }
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     }
     return false;
   }
 
-  static final private boolean jj_3R_139() {
-    if (jj_scan_token(RSIGNEDSHIFT)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3R_134() {
-    if (jj_scan_token(LE)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3R_143() {
-    if (jj_scan_token(PLUS)) return true;
+  static final private boolean jj_3R_173() {
+    if (jj_scan_token(FLOATING_POINT_LITERAL)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_137() {
+  static final private boolean jj_3R_169() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_143()) {
+    if (jj_3R_172()) {
     jj_scanpos = xsp;
-    if (jj_3R_144()) return true;
+    if (jj_3R_173()) {
+    jj_scanpos = xsp;
+    if (jj_3R_174()) {
+    jj_scanpos = xsp;
+    if (jj_3R_175()) {
+    jj_scanpos = xsp;
+    if (jj_3R_176()) {
+    jj_scanpos = xsp;
+    if (jj_3R_177()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_136()) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_130() {
-    if (jj_3R_136()) return true;
+  static final private boolean jj_3R_172() {
+    if (jj_scan_token(INTEGER_LITERAL)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_137()) { jj_scanpos = xsp; break; }
-      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    }
     return false;
   }
 
-  static final private boolean jj_3R_133() {
-    if (jj_scan_token(GT)) return true;
+  static final private boolean jj_3R_116() {
+    if (jj_scan_token(XOR)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_115()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_138() {
-    if (jj_scan_token(LSHIFT)) return true;
+  static final private boolean jj_3R_92() {
+    if (jj_3R_45()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_131() {
+  static final private boolean jj_3R_60() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_138()) {
-    jj_scanpos = xsp;
-    if (jj_3R_139()) {
+    if (jj_3R_92()) {
     jj_scanpos = xsp;
-    if (jj_3R_140()) return true;
+    if (jj_3R_93()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_130()) return true;
+    return false;
+  }
+
+  static final private boolean jj_3R_89() {
+    if (jj_scan_token(IDENTIFIER)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_108()) jj_scanpos = xsp;
+    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_123() {
-    if (jj_3R_130()) return true;
+  static final private boolean jj_3R_113() {
+    if (jj_3R_115()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_131()) { jj_scanpos = xsp; break; }
+      if (jj_3R_116()) { jj_scanpos = xsp; break; }
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     }
     return false;
   }
 
-  static final private boolean jj_3R_200() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3R_132() {
-    if (jj_scan_token(LT)) return true;
+  static final private boolean jj_3R_88() {
+    if (jj_scan_token(LBRACE)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3_2() {
-    if (jj_scan_token(COMMA)) return true;
+    if (jj_3R_45()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_43()) return true;
+    if (jj_scan_token(RBRACE)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_124() {
+  static final private boolean jj_3R_59() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_132()) {
+    if (jj_3R_88()) {
     jj_scanpos = xsp;
-    if (jj_3R_133()) {
+    if (jj_3R_89()) {
     jj_scanpos = xsp;
-    if (jj_3R_134()) {
+    if (jj_3R_90()) {
     jj_scanpos = xsp;
-    if (jj_3R_135()) return true;
+    if (jj_3R_91()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_123()) return true;
+    return false;
+  }
+
+  static final private boolean jj_3R_98() {
+    if (jj_scan_token(LBRACE)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_45()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_scan_token(RBRACE)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_199() {
-    if (jj_3R_43()) return true;
+  static final private boolean jj_3R_49() {
+    if (jj_scan_token(LBRACKET)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_2()) { jj_scanpos = xsp; break; }
-      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    }
+    xsp = jj_scanpos;
+    if (jj_3R_60()) jj_scanpos = xsp;
+    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_scan_token(RBRACKET)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_121() {
-    if (jj_3R_123()) return true;
+  static final private boolean jj_3R_114() {
+    if (jj_scan_token(BIT_OR)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_113()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    return false;
+  }
+
+  static final private boolean jj_3R_109() {
+    if (jj_3R_113()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_124()) { jj_scanpos = xsp; break; }
+      if (jj_3R_114()) { jj_scanpos = xsp; break; }
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     }
     return false;
   }
 
-  static final private boolean jj_3R_194() {
-    if (jj_scan_token(LPAREN)) return true;
+  static final private boolean jj_3R_95() {
+    if (jj_scan_token(DOLLAR)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_199()) jj_scanpos = xsp;
-    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    xsp = jj_scanpos;
-    if (jj_3R_200()) jj_scanpos = xsp;
-    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_scan_token(RPAREN)) return true;
+    if (jj_3R_59()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3_7() {
-    if (jj_3R_48()) return true;
+  static final private boolean jj_3R_110() {
+    if (jj_scan_token(DOT)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3_8() {
-    if (jj_3R_49()) return true;
+    if (jj_3R_109()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_203() {
-    if (jj_scan_token(ARRAYASSIGN)) return true;
+  static final private boolean jj_3R_48() {
+    if (jj_scan_token(CLASSACCESS)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_47()) return true;
+    if (jj_3R_59()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_129() {
-    if (jj_scan_token(TRIPLEEQUAL)) return true;
+  static final private boolean jj_3R_40() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_48()) {
+    jj_scanpos = xsp;
+    if (jj_3R_49()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_43() {
-    if (jj_3R_47()) return true;
+  static final private boolean jj_3R_104() {
+    if (jj_3R_109()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_203()) jj_scanpos = xsp;
-    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_110()) { jj_scanpos = xsp; break; }
+      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    }
     return false;
   }
 
-  static final private boolean jj_3R_128() {
-    if (jj_scan_token(BANGDOUBLEEQUAL)) return true;
+  static final private boolean jj_3R_46() {
+    if (jj_scan_token(IDENTIFIER)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_scan_token(COLON)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_127() {
-    if (jj_scan_token(NE)) return true;
+  static final private boolean jj_3R_94() {
+    if (jj_scan_token(DOLLAR_ID)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_98()) jj_scanpos = xsp;
+    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_126() {
-    if (jj_scan_token(DIF)) return true;
+  static final private boolean jj_3R_61() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_94()) {
+    jj_scanpos = xsp;
+    if (jj_3R_95()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_125() {
-    if (jj_scan_token(EQ)) return true;
+  static final private boolean jj_3R_196() {
+    if (jj_3R_40()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3_6() {
-    if (jj_3R_47()) return true;
+  static final private boolean jj_3R_112() {
+    if (jj_scan_token(_ANDL)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_scan_token(SEMICOLON)) return true;
+    return false;
+  }
+
+  static final private boolean jj_3R_195() {
+    if (jj_3R_199()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_122() {
+  static final private boolean jj_3R_188() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_125()) {
-    jj_scanpos = xsp;
-    if (jj_3R_126()) {
-    jj_scanpos = xsp;
-    if (jj_3R_127()) {
-    jj_scanpos = xsp;
-    if (jj_3R_128()) {
+    if (jj_3R_195()) {
     jj_scanpos = xsp;
-    if (jj_3R_129()) return true;
+    if (jj_3R_196()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_121()) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_119() {
-    if (jj_3R_121()) return true;
+  static final private boolean jj_3R_111() {
+    if (jj_scan_token(AND_AND)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_122()) { jj_scanpos = xsp; break; }
-      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    }
     return false;
   }
 
-  static final private boolean jj_3R_205() {
-    if (jj_scan_token(COMMA)) return true;
+  static final private boolean jj_3R_105() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_111()) {
+    jj_scanpos = xsp;
+    if (jj_3R_112()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_47()) return true;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_104()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_120() {
-    if (jj_scan_token(BIT_AND)) return true;
+  static final private boolean jj_3R_97() {
+    if (jj_scan_token(HOOK)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_119()) return true;
+    if (jj_3R_45()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_scan_token(COLON)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_86()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_204() {
-    if (jj_3R_47()) return true;
+  static final private boolean jj_3R_102() {
+    if (jj_3R_104()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_205()) { jj_scanpos = xsp; break; }
+      if (jj_3R_105()) { jj_scanpos = xsp; break; }
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     }
     return false;
   }
 
-  static final private boolean jj_3R_117() {
-    if (jj_3R_119()) return true;
+  static final private boolean jj_3R_187() {
+    if (jj_3R_50()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_120()) { jj_scanpos = xsp; break; }
-      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    }
     return false;
   }
 
-  static final private boolean jj_3R_202() {
-    if (jj_3R_204()) return true;
+  static final private boolean jj_3R_186() {
+    if (jj_scan_token(IDENTIFIER)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_118() {
-    if (jj_scan_token(XOR)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_117()) return true;
+  static final private boolean jj_3R_178() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_186()) {
+    jj_scanpos = xsp;
+    if (jj_3R_187()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_93() {
-    if (jj_scan_token(DOLLAR_ID)) return true;
+  static final private boolean jj_3_1() {
+    if (jj_3R_40()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_201() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_202()) jj_scanpos = xsp;
-    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_scan_token(RPAREN)) return true;
+  static final private boolean jj_3R_107() {
+    if (jj_scan_token(_ORL)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_110() {
-    if (jj_scan_token(LBRACE)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_47()) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_scan_token(RBRACE)) return true;
+  static final private boolean jj_3R_106() {
+    if (jj_scan_token(OR_OR)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_115() {
-    if (jj_3R_117()) return true;
+  static final private boolean jj_3R_50() {
+    if (jj_3R_61()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_118()) { jj_scanpos = xsp; break; }
+      if (jj_3_1()) { jj_scanpos = xsp; break; }
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     }
     return false;
   }
 
-  static final private boolean jj_3R_196() {
-    if (jj_scan_token(FALSE)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3R_92() {
-    if (jj_scan_token(DOLLAR)) return true;
+  static final private boolean jj_3R_103() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_106()) {
+    jj_scanpos = xsp;
+    if (jj_3R_107()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_61()) return true;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_102()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_95() {
-    if (jj_3R_54()) return true;
+  static final private boolean jj_3R_96() {
+    if (jj_3R_102()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_103()) { jj_scanpos = xsp; break; }
+      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    }
     return false;
   }
 
-  static final private boolean jj_3R_195() {
-    if (jj_scan_token(TRUE)) return true;
+  static final private boolean jj_3R_86() {
+    if (jj_3R_96()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3R_185() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_195()) {
-    jj_scanpos = xsp;
-    if (jj_3R_196()) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_97()) jj_scanpos = xsp;
+    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_116() {
-    if (jj_scan_token(BIT_OR)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_115()) return true;
+  static final private boolean jj_3R_191() {
+    if (jj_3R_50()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_176() {
-    if (jj_scan_token(NULL)) return true;
+  static final private boolean jj_3R_190() {
+    if (jj_scan_token(NEW)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_178()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_111() {
-    if (jj_3R_115()) return true;
+  static final private boolean jj_3R_74() {
+    if (jj_scan_token(TILDEEQUAL)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_116()) { jj_scanpos = xsp; break; }
-      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    }
     return false;
   }
 
-  static final private boolean jj_3R_175() {
-    if (jj_3R_185()) return true;
+  static final private boolean jj_3R_73() {
+    if (jj_scan_token(DOTASSIGN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_174() {
-    if (jj_scan_token(STRING_LITERAL)) return true;
+  static final private boolean jj_3R_72() {
+    if (jj_scan_token(ORASSIGN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_173() {
-    if (jj_scan_token(FLOATING_POINT_LITERAL)) return true;
+  static final private boolean jj_3R_189() {
+    if (jj_scan_token(IDENTIFIER)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_169() {
+  static final private boolean jj_3R_180() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_172()) {
-    jj_scanpos = xsp;
-    if (jj_3R_173()) {
-    jj_scanpos = xsp;
-    if (jj_3R_174()) {
+    if (jj_3R_189()) {
     jj_scanpos = xsp;
-    if (jj_3R_175()) {
+    if (jj_3R_190()) {
     jj_scanpos = xsp;
-    if (jj_3R_176()) return true;
+    if (jj_3R_191()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_172() {
-    if (jj_scan_token(INTEGER_LITERAL)) return true;
+  static final private boolean jj_3R_71() {
+    if (jj_scan_token(XORASSIGN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_91() {
-    if (jj_scan_token(IDENTIFIER)) return true;
+  static final private boolean jj_3R_70() {
+    if (jj_scan_token(ANDASSIGN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_110()) jj_scanpos = xsp;
-    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_114() {
-    if (jj_scan_token(_ANDL)) return true;
+  static final private boolean jj_3R_69() {
+    if (jj_scan_token(RSIGNEDSHIFTASSIGN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_89() {
-    if (jj_scan_token(ASSIGN)) return true;
+  static final private boolean jj_3R_68() {
+    if (jj_scan_token(LSHIFTASSIGN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_47()) return true;
+    return false;
+  }
+
+  static final private boolean jj_3R_67() {
+    if (jj_scan_token(MINUSASSIGN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_90() {
-    if (jj_scan_token(LBRACE)) return true;
+  static final private boolean jj_3R_66() {
+    if (jj_scan_token(PLUSASSIGN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_47()) return true;
+    return false;
+  }
+
+  static final private boolean jj_3R_65() {
+    if (jj_scan_token(REMASSIGN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_scan_token(RBRACE)) return true;
+    return false;
+  }
+
+  static final private boolean jj_3R_64() {
+    if (jj_scan_token(SLASHASSIGN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_61() {
+  static final private boolean jj_3R_63() {
+    if (jj_scan_token(STARASSIGN)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    return false;
+  }
+
+  static final private boolean jj_3R_51() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_90()) {
+    if (jj_3R_62()) {
     jj_scanpos = xsp;
-    if (jj_3R_91()) {
+    if (jj_3R_63()) {
     jj_scanpos = xsp;
-    if (jj_3R_92()) {
+    if (jj_3R_64()) {
     jj_scanpos = xsp;
-    if (jj_3R_93()) return true;
+    if (jj_3R_65()) {
+    jj_scanpos = xsp;
+    if (jj_3R_66()) {
+    jj_scanpos = xsp;
+    if (jj_3R_67()) {
+    jj_scanpos = xsp;
+    if (jj_3R_68()) {
+    jj_scanpos = xsp;
+    if (jj_3R_69()) {
+    jj_scanpos = xsp;
+    if (jj_3R_70()) {
+    jj_scanpos = xsp;
+    if (jj_3R_71()) {
+    jj_scanpos = xsp;
+    if (jj_3R_72()) {
+    jj_scanpos = xsp;
+    if (jj_3R_73()) {
+    jj_scanpos = xsp;
+    if (jj_3R_74()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_60() {
-    if (jj_scan_token(COMMA)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_59()) return true;
+  static final private boolean jj_3R_62() {
+    if (jj_scan_token(ASSIGN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_100() {
-    if (jj_scan_token(LBRACE)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_47()) return true;
+  static final private boolean jj_3R_182() {
+    if (jj_scan_token(ARRAY)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_scan_token(RBRACE)) return true;
+    if (jj_3R_192()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_112() {
-    if (jj_scan_token(DOT)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_111()) return true;
+  static final private boolean jj_3R_171() {
+    if (jj_3R_182()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_94() {
+  static final private boolean jj_3_8() {
     if (jj_3R_47()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_62() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_94()) {
-    jj_scanpos = xsp;
-    if (jj_3R_95()) return true;
+  static final private boolean jj_3R_181() {
+    if (jj_3R_188()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_106() {
-    if (jj_3R_111()) return true;
+  static final private boolean jj_3R_170() {
+    if (jj_3R_180()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_112()) { jj_scanpos = xsp; break; }
+      if (jj_3R_181()) { jj_scanpos = xsp; break; }
       if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     }
     return false;
   }
 
-  static final private boolean jj_3R_97() {
-    if (jj_scan_token(DOLLAR)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_61()) return true;
+  static final private boolean jj_3R_179() {
+    if (jj_3R_188()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_109() {
-    if (jj_scan_token(_ORL)) return true;
+  static final private boolean jj_3R_42() {
+    if (jj_3R_50()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_51()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_45()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_51() {
-    if (jj_scan_token(LBRACKET)) return true;
+  static final private boolean jj_3R_101() {
+    if (jj_scan_token(ASSIGN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_62()) jj_scanpos = xsp;
-    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_scan_token(RBRACKET)) return true;
+    if (jj_3R_45()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_113() {
-    if (jj_scan_token(SC_AND)) return true;
+  static final private boolean jj_3_5() {
+    if (jj_scan_token(IDENTIFIER)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_scan_token(STATICCLASSACCESS)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_178()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_179()) { jj_scanpos = xsp; break; }
+      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    }
     return false;
   }
 
-  static final private boolean jj_3R_107() {
+  static final private boolean jj_3R_166() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_113()) {
+    if (jj_3_5()) {
     jj_scanpos = xsp;
-    if (jj_3R_114()) return true;
+    if (jj_3R_170()) {
+    jj_scanpos = xsp;
+    if (jj_3R_171()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_106()) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_59() {
-    if (jj_3R_52()) return true;
+  static final private boolean jj_3_3() {
+    if (jj_3R_42()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_89()) jj_scanpos = xsp;
-    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_96() {
-    if (jj_scan_token(DOLLAR_ID)) return true;
+  static final private boolean jj_3R_56() {
+    if (jj_3R_86()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_100()) jj_scanpos = xsp;
-    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_63() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_96()) {
-    jj_scanpos = xsp;
-    if (jj_3R_97()) return true;
+  static final private boolean jj_3R_55() {
+    if (jj_3R_42()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_104() {
-    if (jj_3R_106()) return true;
+  static final private boolean jj_3R_194() {
+    if (jj_scan_token(DECR)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_107()) { jj_scanpos = xsp; break; }
-      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    }
     return false;
   }
 
-  static final private boolean jj_3R_99() {
-    if (jj_scan_token(HOOK)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_47()) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_88()) return true;
+  static final private boolean jj_3R_54() {
+    if (jj_3R_85()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_49() {
-    if (jj_3R_59()) return true;
+  static final private boolean jj_3R_193() {
+    if (jj_scan_token(INCR)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_60()) { jj_scanpos = xsp; break; }
-      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    }
     return false;
   }
 
-  static final private boolean jj_3R_50() {
-    if (jj_scan_token(CLASSACCESS)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_61()) return true;
+  static final private boolean jj_3R_185() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_193()) {
+    jj_scanpos = xsp;
+    if (jj_3R_194()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_42() {
+  static final private boolean jj_3R_45() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_50()) {
+    if (jj_3R_53()) {
     jj_scanpos = xsp;
-    if (jj_3R_51()) return true;
+    if (jj_3R_54()) {
+    jj_scanpos = xsp;
+    if (jj_3R_55()) {
+    jj_scanpos = xsp;
+    if (jj_3R_56()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_198() {
-    if (jj_3R_42()) return true;
+  static final private boolean jj_3R_53() {
+    if (jj_3R_84()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_197() {
-    if (jj_3R_201()) return true;
+  static final private boolean jj_3R_168() {
+    if (jj_3R_166()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_185()) jj_scanpos = xsp;
+    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_193() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_197()) {
-    jj_scanpos = xsp;
-    if (jj_3R_198()) return true;
+  static final private boolean jj_3R_100() {
+    if (jj_scan_token(COMMA)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_50()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3_1() {
-    if (jj_3R_42()) return true;
+  static final private boolean jj_3R_99() {
+    if (jj_3R_50()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_108() {
-    if (jj_scan_token(SC_OR)) return true;
+  static final private boolean jj_3R_83() {
+    if (jj_scan_token(OBJECT)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_105() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_108()) {
-    jj_scanpos = xsp;
-    if (jj_3R_109()) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_104()) return true;
+  static final private boolean jj_3R_44() {
+    if (jj_scan_token(ARRAY)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_52() {
-    if (jj_3R_63()) return true;
+  static final private boolean jj_3R_184() {
+    if (jj_scan_token(ARRAY)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_1()) { jj_scanpos = xsp; break; }
-      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    }
     return false;
   }
 
-  static final private boolean jj_3R_98() {
-    if (jj_3R_104()) return true;
+  static final private boolean jj_3R_82() {
+    if (jj_scan_token(INTEGER)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_105()) { jj_scanpos = xsp; break; }
-      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    }
     return false;
   }
 
-  static final private boolean jj_3R_192() {
+  static final private boolean jj_3R_183() {
     if (jj_3R_52()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_191() {
-    if (jj_scan_token(IDENTIFIER)) return true;
+  static final private boolean jj_3R_81() {
+    if (jj_scan_token(INT)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_182() {
+  static final private boolean jj_3R_167() {
+    if (jj_scan_token(LPAREN)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_191()) {
+    if (jj_3R_183()) {
     jj_scanpos = xsp;
-    if (jj_3R_192()) return true;
+    if (jj_3R_184()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_scan_token(RPAREN)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_139()) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_88() {
-    if (jj_3R_98()) return true;
+  static final private boolean jj_3R_80() {
+    if (jj_scan_token(FLOAT)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_99()) jj_scanpos = xsp;
-    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_188() {
+  static final private boolean jj_3R_43() {
     if (jj_3R_52()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_76() {
-    if (jj_scan_token(TILDEEQUAL)) return true;
+  static final private boolean jj_3R_79() {
+    if (jj_scan_token(DOUBLE)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_190() {
-    if (jj_scan_token(DECR)) return true;
+  static final private boolean jj_3R_85() {
+    if (jj_scan_token(LIST)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3R_187() {
-    if (jj_scan_token(NEW)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_182()) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_99()) jj_scanpos = xsp;
+    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_100()) { jj_scanpos = xsp; break; }
+      if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    }
+    if (jj_scan_token(RPAREN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    xsp = jj_scanpos;
+    if (jj_3R_101()) jj_scanpos = xsp;
+    else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_75() {
-    if (jj_scan_token(DOTASSIGN)) return true;
+  static final private boolean jj_3R_78() {
+    if (jj_scan_token(REAL)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_186() {
-    if (jj_scan_token(IDENTIFIER)) return true;
+  static final private boolean jj_3R_77() {
+    if (jj_scan_token(BOOLEAN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_177() {
+  static final private boolean jj_3_4() {
+    if (jj_scan_token(LPAREN)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_186()) {
+    if (jj_3R_43()) {
     jj_scanpos = xsp;
-    if (jj_3R_187()) {
-    jj_scanpos = xsp;
-    if (jj_3R_188()) return true;
+    if (jj_3R_44()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3R_74() {
-    if (jj_scan_token(ORASSIGN)) return true;
+    if (jj_scan_token(RPAREN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_73() {
-    if (jj_scan_token(XORASSIGN)) return true;
+  static final private boolean jj_3R_76() {
+    if (jj_scan_token(BOOL)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_72() {
-    if (jj_scan_token(ANDASSIGN)) return true;
+  static final private boolean jj_3R_84() {
+    if (jj_scan_token(PRINT)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3R_71() {
-    if (jj_scan_token(RSIGNEDSHIFTASSIGN)) return true;
+    if (jj_3R_45()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_70() {
-    if (jj_scan_token(LSHIFTASSIGN)) return true;
+  static final private boolean jj_3R_75() {
+    if (jj_scan_token(STRING)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_48() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_scan_token(COLON)) return true;
+  static final private boolean jj_3R_52() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_75()) {
+    jj_scanpos = xsp;
+    if (jj_3R_76()) {
+    jj_scanpos = xsp;
+    if (jj_3R_77()) {
+    jj_scanpos = xsp;
+    if (jj_3R_78()) {
+    jj_scanpos = xsp;
+    if (jj_3R_79()) {
+    jj_scanpos = xsp;
+    if (jj_3R_80()) {
+    jj_scanpos = xsp;
+    if (jj_3R_81()) {
+    jj_scanpos = xsp;
+    if (jj_3R_82()) {
+    jj_scanpos = xsp;
+    if (jj_3R_83()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_69() {
-    if (jj_scan_token(MINUSASSIGN)) return true;
+  static final private boolean jj_3R_165() {
+    if (jj_scan_token(LPAREN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3R_68() {
-    if (jj_scan_token(PLUSASSIGN)) return true;
+    if (jj_3R_45()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    return false;
-  }
-
-  static final private boolean jj_3R_67() {
-    if (jj_scan_token(REMASSIGN)) return true;
+    if (jj_scan_token(RPAREN)) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_66() {
-    if (jj_scan_token(SLASHASSIGN)) return true;
+  static final private boolean jj_3R_164() {
+    if (jj_3R_169()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_65() {
-    if (jj_scan_token(STARASSIGN)) return true;
+  static final private boolean jj_3R_163() {
+    if (jj_3R_168()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_178() {
-    if (jj_scan_token(ARRAY)) return true;
-    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    if (jj_3R_194()) return true;
+  static final private boolean jj_3R_162() {
+    if (jj_3R_167()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_53() {
+  static final private boolean jj_3R_158() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_64()) {
-    jj_scanpos = xsp;
-    if (jj_3R_65()) {
-    jj_scanpos = xsp;
-    if (jj_3R_66()) {
-    jj_scanpos = xsp;
-    if (jj_3R_67()) {
-    jj_scanpos = xsp;
-    if (jj_3R_68()) {
-    jj_scanpos = xsp;
-    if (jj_3R_69()) {
-    jj_scanpos = xsp;
-    if (jj_3R_70()) {
-    jj_scanpos = xsp;
-    if (jj_3R_71()) {
-    jj_scanpos = xsp;
-    if (jj_3R_72()) {
+    if (jj_3R_161()) {
     jj_scanpos = xsp;
-    if (jj_3R_73()) {
+    if (jj_3R_162()) {
     jj_scanpos = xsp;
-    if (jj_3R_74()) {
+    if (jj_3R_163()) {
     jj_scanpos = xsp;
-    if (jj_3R_75()) {
+    if (jj_3R_164()) {
     jj_scanpos = xsp;
-    if (jj_3R_76()) return true;
+    if (jj_3R_165()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
-    } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
 
-  static final private boolean jj_3R_64() {
-    if (jj_scan_token(ASSIGN)) return true;
+  static final private boolean jj_3R_161() {
+    if (jj_scan_token(BANG)) return true;
+    if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
+    if (jj_3R_139()) return true;
     if (jj_la == 0 && jj_scanpos == jj_lastpos) return false;
     return false;
   }
@@ -6169,7 +6529,7 @@ final int pos = jj_input_stream.getPosition();
   static public boolean lookingAhead = false;
   static private boolean jj_semLA;
   static private int jj_gen;
-  static final private int[] jj_la1 = new int[126];
+  static final private int[] jj_la1 = new int[123];
   static private int[] jj_la1_0;
   static private int[] jj_la1_1;
   static private int[] jj_la1_2;
@@ -6183,19 +6543,19 @@ final int pos = jj_input_stream.getPosition();
       jj_la1_4();
    }
    private static void jj_la1_0() {
-      jj_la1_0 = new int[] {0xfcb0001e,0x6,0x6,0xfcb0001e,0x0,0xfcb00000,0x0,0x600000,0x600000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x0,0x34000000,0x0,0x0,0x0,0x0,0x0,0x0,0x30000000,0x4000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x0,0x4000000,0x0,0x0,0x4000000,0x4000000,0x0,0x0,0x0,0x0,0x4000000,0x0,0x4000000,0x0,0x0,0x34000000,0x34000000,0x0,0x0,0x0,0x34000000,0x0,0x0,0xc4800000,0xfc800000,0x8,0x6,0x80000000,0x0,0x0,0x0,0x0,0x0,0x0,0xfcb00010,0xfcb00010,0xfcb00000,0xf4b00000,0x0,0x0,0x0,0x0,0x4000000,0x0,0x0,0x0,0xf4b00010,0xf4b00010,0x8000000,0x34000000,0x0,0xfc800010,0xfc800010,0x1000000,0x2000000,0xfc800010,0x1000000,0x2000000,0xfc800010,0xfc800010,0xfc800010,0xfc800010,0xfc800010,0xfc800000,0xfc800000,0x0,0x0,0x4000000,0x34000000,0x4000000,0xfc800000,0xfc800000,0x4000000,0x0,0x34000000,0x34000000,};
+      jj_la1_0 = new int[] {0xfcb0001e,0x6,0x6,0xfcb0001e,0x0,0xfcb00000,0x0,0x600000,0x600000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x0,0x34000000,0x0,0x0,0x0,0x0,0x0,0x0,0x30000000,0x4000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x4000000,0x0,0x4000000,0x0,0x0,0x4000000,0x4000000,0x0,0x0,0x0,0x0,0x4000000,0x0,0x4000000,0x0,0x0,0x34000000,0x34000000,0x0,0x0,0x34000000,0x0,0x0,0xc4800000,0xfc800000,0x8,0x6,0x80000000,0x0,0x0,0x0,0x0,0x0,0x0,0xfcb00010,0xfcb00010,0xfcb00000,0xf4b00000,0x0,0x0,0x0,0x0,0x4000000,0x0,0x0,0x0,0xf4b00010,0xf4b00010,0x8000000,0x0,0x34000000,0xfc800010,0xfc800010,0x1000000,0x2000000,0xfc800010,0x1000000,0x2000000,0xfc800010,0xfc800010,0xfc800010,0xfc800010,0xfc800010,0xfc800000,0xfc800000,0x4000000,0x34000000,0x4000000,0xfc800000,0xfc800000,0x4000000,0x0,0x34000000,0x34000000,};
    }
    private static void jj_la1_1() {
-      jj_la1_1 = new int[] {0x21d7541f,0x0,0x0,0x21d7541f,0x0,0x21d7541f,0x2000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc20000,0x80,0xc30000,0x0,0x0,0x0,0x0,0x0,0x80000000,0x0,0xc30000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc30000,0x0,0xc30000,0x0,0x0,0xc30000,0x80000000,0x0,0x0,0x20,0x20,0x10000,0x10000,0x10000,0x0,0x20,0x80c30000,0x80c30000,0x20,0xc20000,0xc00000,0xc30000,0x0,0x0,0x2115541f,0x21d7541f,0x0,0x0,0x7,0x0,0x0,0x0,0x0,0x0,0x0,0x21d7541f,0x21d7541f,0x21d7541f,0x21d7541f,0x0,0x0,0x0,0x0,0x10000,0x0,0x900,0x900,0x21d7541f,0x21d7541f,0x0,0xc30000,0x900,0x21d7541f,0x21d7541f,0x0,0x0,0x21d7541f,0x0,0x0,0x21d7541f,0x21d7541f,0x21d7541f,0x21d7541f,0x21d7541f,0x21d7541f,0x21d7541f,0x20,0x80,0x10000,0xc30000,0x10000,0x21d7541f,0x21d7541f,0x10000,0x0,0xc30000,0xc30000,};
+      jj_la1_1 = new int[] {0x21d7541f,0x0,0x0,0x21d7541f,0x0,0x21d7541f,0x2000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc20000,0x80,0xc30000,0x0,0x0,0x0,0x0,0x0,0x80000000,0x0,0xc30000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc30000,0xc30000,0x0,0xc30000,0x0,0x0,0xc30000,0x80000000,0x0,0x0,0x20,0x20,0x10000,0x10000,0x10000,0x0,0x20,0x80c30000,0x80c30000,0x20,0xc20000,0xc30000,0x0,0x0,0x2115541f,0x21d7541f,0x0,0x0,0x7,0x0,0x0,0x0,0x0,0x0,0x0,0x21d7541f,0x21d7541f,0x21d7541f,0x21d7541f,0x0,0x0,0x0,0x0,0x10000,0x0,0x900,0x900,0x21d7541f,0x21d7541f,0x0,0x900,0xc30000,0x21d7541f,0x21d7541f,0x0,0x0,0x21d7541f,0x0,0x0,0x21d7541f,0x21d7541f,0x21d7541f,0x21d7541f,0x21d7541f,0x21d7541f,0x21d7541f,0x10000,0xc30000,0x10000,0x21d7541f,0x21d7541f,0x10000,0x0,0xc30000,0xc30000,};
    }
    private static void jj_la1_2() {
-      jj_la1_2 = new int[] {0x45114400,0x0,0x0,0x45114400,0x40000000,0x45114400,0x0,0x0,0x0,0x80000000,0x0,0x4000000,0x0,0x4000000,0x4100000,0x4400,0x4400,0x114400,0x0,0x1114400,0x80000000,0x0,0x80000000,0x0,0x0,0xff,0x0,0x1114400,0x0,0x0,0x100,0x100,0x200,0x200,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1114400,0x0,0x1114400,0x0,0x0,0x1114400,0xff,0x0,0x0,0x11000000,0x11000000,0x100000,0x100000,0x100000,0x100000,0x11000000,0x11144ff,0x11144ff,0x10000000,0x14400,0x0,0x1114400,0x80000000,0x0,0x44100000,0x45114400,0x0,0x0,0x0,0x0,0x80000000,0x0,0x80000000,0x80000000,0x80000000,0x45114400,0x45114400,0x45114400,0x45114400,0x80000000,0x0,0x0,0x0,0x100000,0x4000000,0x0,0x0,0x45114400,0x45114400,0x0,0x1114400,0x0,0x45114400,0x45114400,0x0,0x0,0x45114400,0x0,0x0,0x45114400,0x45114400,0x45114400,0x45114400,0x45114400,0x45114400,0x45114400,0x10000000,0x0,0x100000,0x1114400,0x100000,0x45114400,0x45114400,0x100000,0x80000000,0x1114400,0x1114400,};
+      jj_la1_2 = new int[] {0x804f0700,0x0,0x0,0x804f0700,0x0,0x804f0700,0x0,0x0,0x0,0x0,0x0,0x0,0x200,0x0,0x200,0x80000000,0x80000000,0x800c0000,0x0,0x804f0700,0x0,0x400000,0x0,0x400200,0x400000,0xff,0x0,0x804f0700,0x0,0x1000,0x20004000,0x20004000,0x40008000,0x40008000,0x0,0x800000,0x1000000,0x400000,0x0,0x0,0x0,0x0,0x1c000000,0x1c000000,0xc0000,0xc0000,0x2300000,0x2300000,0x804f0700,0x800f0700,0xc0000,0x800f0600,0x30000,0x400,0x80000200,0xff,0x30000,0x30000,0x0,0x0,0x200,0x200,0x200,0x200,0x0,0x804f07ff,0x804f07ff,0x0,0x80000000,0x804f0700,0x0,0x100,0x30300,0x804f0700,0x0,0x0,0x0,0x200,0x0,0x0,0x0,0x0,0x0,0x804f0700,0x804f0700,0x804f0700,0x804f0700,0x0,0x0,0x30000,0x30000,0x30200,0x2000,0x0,0x0,0x804f0700,0x804f0700,0x0,0x0,0x804f0700,0x804f0700,0x804f0700,0x0,0x0,0x804f0700,0x0,0x0,0x804f2700,0x804f0700,0x804f0700,0x804f0700,0x804f0700,0x804f0700,0x804f2700,0x30200,0x804f0700,0x30200,0x804f0700,0x804f2700,0x30200,0x0,0x804f0700,0x804f0700,};
    }
    private static void jj_la1_3() {
-      jj_la1_3 = new int[] {0xe0e00000,0x0,0x0,0xe0e00000,0x0,0xe0e00000,0x0,0x0,0x0,0x0,0x400,0x0,0x400000,0x0,0x400000,0x0,0x0,0x80000000,0x0,0xe0e00000,0x0,0x0,0x0,0x400000,0x0,0x0,0x0,0xe0e00000,0x1ffc00,0x2000000,0x8000000,0x8000000,0x10000000,0x10000000,0x1,0x0,0x0,0x0,0x3c8,0x3c8,0x36,0x36,0x0,0x0,0x80000000,0x80000000,0x0,0x0,0x200000,0xe0e00000,0x80000000,0xe0c00000,0x60000000,0x800000,0x400000,0x0,0x60000000,0x60000000,0x0,0x0,0x400000,0x400000,0x400000,0x400000,0x0,0xe0e00000,0xe0e00000,0x0,0x0,0x0,0xe0e00000,0x0,0x200000,0x60600000,0xe0e00000,0x0,0x0,0x0,0x400000,0x0,0x400,0x0,0x0,0x0,0xe0e00000,0xe0e00000,0xe0e00000,0xe0e00000,0x0,0x400,0x601ffc00,0x601ffc00,0x60400000,0x4000000,0x0,0x0,0xe0e00000,0xe0e00000,0x0,0xe0e00000,0x0,0xe0e00000,0xe0e00000,0x0,0x0,0xe0e00000,0x0,0x0,0xe4e00000,0xe0e00000,0xe0e00000,0xe0e00000,0xe0e00000,0xe0e00000,0xe4e00000,0x0,0x0,0x60400000,0xe0e00000,0x60400000,0xe0e00000,0xe4e00000,0x60400000,0x0,0xe0e00000,0xe0e00000,};
+      jj_la1_3 = new int[] {0x8a228,0x0,0x0,0x8a228,0x80000,0x8a228,0x0,0x0,0x0,0x100000,0x80000000,0x8000,0x0,0x8000,0x8200,0x8,0x8,0x228,0x0,0x2228,0x100000,0x0,0x100000,0x0,0x0,0x0,0x0,0x2228,0x80000000,0x0,0x0,0x0,0x0,0x0,0x200000,0x0,0x0,0x0,0x79000000,0x79000000,0x6c00000,0x6c00000,0x0,0x0,0x0,0x0,0x0,0x0,0x2228,0x2228,0x0,0x2228,0x0,0x0,0x2228,0x0,0x0,0x0,0x22000,0x22000,0x200,0x200,0x200,0x200,0x22000,0x2228,0x2228,0x20000,0x28,0x2228,0x100000,0x0,0x88200,0x8a228,0x0,0x0,0x0,0x0,0x100000,0x80000000,0x100000,0x100000,0x100000,0x8a228,0x8a228,0x8a228,0x8a228,0x100000,0x80000000,0x80000000,0x80000000,0x200,0x8000,0x0,0x0,0x8a228,0x8a228,0x0,0x0,0x2228,0x8a228,0x8a228,0x0,0x0,0x8a228,0x0,0x0,0x8a228,0x8a228,0x8a228,0x8a228,0x8a228,0x8a228,0x8a228,0x200,0x2228,0x200,0x8a228,0x8a228,0x200,0x100000,0x2228,0x2228,};
    }
    private static void jj_la1_4() {
-      jj_la1_4 = new int[] {0x1009,0x0,0x0,0x1009,0x0,0x1009,0x0,0x0,0x0,0x0,0x0,0x0,0x1000,0x0,0x1000,0x0,0x0,0x1,0x0,0x1009,0x0,0x8,0x0,0x1008,0x8,0x0,0x0,0x1009,0xc00,0x0,0x0,0x0,0x0,0x0,0x0,0x10,0x20,0x8,0x0,0x0,0x0,0x0,0x380,0x380,0x1,0x1,0x46,0x46,0x0,0x1009,0x1,0x1001,0x0,0x0,0x1000,0x0,0x0,0x0,0x0,0x0,0x1000,0x1000,0x1000,0x1000,0x0,0x1009,0x1009,0x0,0x0,0x0,0x1009,0x0,0x0,0x1000,0x1009,0x0,0x0,0x0,0x1000,0x0,0x0,0x0,0x0,0x0,0x1009,0x1009,0x1009,0x1009,0x0,0x0,0xc00,0xc00,0x1000,0x0,0x0,0x0,0x1009,0x1009,0x0,0x1009,0x0,0x1009,0x1009,0x0,0x0,0x1009,0x0,0x0,0x1009,0x1009,0x1009,0x1009,0x1009,0x1009,0x1009,0x0,0x0,0x1000,0x1009,0x1000,0x1009,0x1009,0x1000,0x0,0x1009,0x1009,};
+      jj_la1_4 = new int[] {0x1000,0x0,0x0,0x1000,0x0,0x1000,0x0,0x0,0x0,0x0,0x0,0x0,0x1000,0x0,0x1000,0x0,0x0,0x0,0x0,0x1000,0x0,0x0,0x0,0x1000,0x0,0x0,0x0,0x1000,0xfff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000,0x1000,0x0,0x1000,0x0,0x0,0x1000,0x0,0x0,0x0,0x0,0x0,0x1000,0x1000,0x1000,0x1000,0x0,0x1000,0x1000,0x0,0x0,0x1000,0x0,0x0,0x1000,0x1000,0x0,0x0,0x0,0x1000,0x0,0x0,0x0,0x0,0x0,0x1000,0x1000,0x1000,0x1000,0x0,0x0,0xfff,0xfff,0x1000,0x0,0x0,0x0,0x1000,0x1000,0x0,0x0,0x1000,0x1000,0x1000,0x0,0x0,0x1000,0x0,0x0,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0,0x1000,0x1000,};
    }
   static final private JJCalls[] jj_2_rtns = new JJCalls[8];
   static private boolean jj_rescan = false;
@@ -6214,7 +6574,7 @@ final int pos = jj_input_stream.getPosition();
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 126; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 123; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6224,7 +6584,7 @@ final int pos = jj_input_stream.getPosition();
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 126; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 123; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6241,7 +6601,7 @@ final int pos = jj_input_stream.getPosition();
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 126; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 123; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6251,7 +6611,7 @@ final int pos = jj_input_stream.getPosition();
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 126; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 123; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6267,7 +6627,7 @@ final int pos = jj_input_stream.getPosition();
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 126; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 123; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6276,7 +6636,7 @@ final int pos = jj_input_stream.getPosition();
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 126; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 123; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -6391,7 +6751,7 @@ final int pos = jj_input_stream.getPosition();
       la1tokens[jj_kind] = true;
       jj_kind = -1;
     }
-    for (int i = 0; i < 126; i++) {
+    for (int i = 0; i < 123; i++) {
       if (jj_la1[i] == jj_gen) {
         for (int j = 0; j < 32; j++) {
           if ((jj_la1_0[i] & (1<<j)) != 0) {
index 35b3173..823b11e 100644 (file)
@@ -30,14 +30,16 @@ import org.eclipse.jface.preference.IPreferenceStore;
 
 import java.util.Hashtable;
 import java.util.Enumeration;
+import java.util.ArrayList;
 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.*;
 import net.sourceforge.phpdt.internal.compiler.ast.*;
+import net.sourceforge.phpdt.internal.compiler.parser.OutlineableWithChildren;
+import net.sourceforge.phpdt.internal.compiler.parser.PHPOutlineInfo;
 
 /**
  * A new php parser.
@@ -52,13 +54,13 @@ public final class PHPParser extends PHPParserSuperclass {
   private static IFile fileToParse;
 
   /** The current segment. */
-  private static PHPSegmentWithChildren currentSegment;
+  private static OutlineableWithChildren currentSegment;
 
   private static final String PARSE_ERROR_STRING = "Parse error"; //$NON-NLS-1$
   private static final String PARSE_WARNING_STRING = "Warning"; //$NON-NLS-1$
   static PHPOutlineInfo outlineInfo;
 
-  private static PHPFunctionDeclaration currentFunction;
+  public static MethodDeclaration currentFunction;
   private static boolean assigning;
 
   /** The error level of the current ParseException. */
@@ -68,13 +70,19 @@ public final class PHPParser extends PHPParserSuperclass {
 
   private static int errorStart = -1;
   private static int errorEnd = -1;
+  private static PHPDocument phpDocument;
+  /**
+   * The point where html starts.
+   * It will be used by the token manager to create HTMLCode objects
+   */
+  public static int htmlStart;
 
   //ast stack
   private final static int AstStackIncrement = 100;
   /** The stack of node. */
-  private static AstNode[] astStack;
+  private static AstNode[] nodes;
   /** The cursor in expression stack. */
-       private static int expressionPtr;
+  private static int nodePtr;
 
   public final void setFileToParse(final IFile fileToParse) {
     this.fileToParse = fileToParse;
@@ -88,6 +96,32 @@ public final class PHPParser extends PHPParserSuperclass {
     this.fileToParse = fileToParse;
   }
 
+  /**
+   * Reinitialize the parser.
+   */
+  private static final void init() {
+    nodes = new AstNode[AstStackIncrement];
+    nodePtr = -1;
+    htmlStart = 0;
+  }
+
+  /**
+   * Add an php node on the stack.
+   * @param node the node that will be added to the stack
+   */
+  private static final void pushOnAstNodes(AstNode node) {
+    try {
+      nodes[++nodePtr] = node;
+    } catch (IndexOutOfBoundsException e) {
+      int oldStackLength = nodes.length;
+      AstNode[] oldStack = nodes;
+      nodes = new AstNode[oldStackLength + AstStackIncrement];
+      System.arraycopy(oldStack, 0, nodes, 0, oldStackLength);
+      nodePtr = oldStackLength;
+      nodes[nodePtr] = node;
+    }
+  }
+
   public static final void phpParserTester(final String strEval) throws CoreException, ParseException {
     PHPParserTokenManager.SwitchTo(PHPParserTokenManager.PHPPARSING);
     final StringReader stream = new StringReader(strEval);
@@ -95,7 +129,7 @@ public final class PHPParser extends PHPParserSuperclass {
       jj_input_stream = new SimpleCharStream(stream, 1, 1);
     }
     ReInit(new StringReader(strEval));
-    astStack = new AstNode[AstStackIncrement];
+    init();
     phpTest();
   }
 
@@ -106,7 +140,7 @@ public final class PHPParser extends PHPParserSuperclass {
         jj_input_stream = new SimpleCharStream(stream, 1, 1);
       }
       ReInit(stream);
-      astStack = new AstNode[AstStackIncrement];
+      init();
       phpFile();
     } catch (FileNotFoundException e) {
       e.printStackTrace();  //To change body of catch statement use Options | File Templates.
@@ -119,21 +153,22 @@ public final class PHPParser extends PHPParserSuperclass {
       jj_input_stream = new SimpleCharStream(stream, 1, 1);
     }
     ReInit(stream);
-    astStack = new AstNode[AstStackIncrement];
+    init();
     phpFile();
   }
 
   public final PHPOutlineInfo parseInfo(final Object parent, final String s) {
+    currentSegment = new PHPDocument(parent);
     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);
-    astStack = new AstNode[AstStackIncrement];
+    init();
     try {
       parse();
+      //PHPeclipsePlugin.log(1,phpDocument.toString());
     } catch (ParseException e) {
       processParseException(e);
     }
@@ -256,7 +291,7 @@ public final class PHPParser extends PHPParserSuperclass {
       jj_input_stream = new SimpleCharStream(stream, 1, 1);
     }
     ReInit(stream);
-    astStack = new AstNode[AstStackIncrement];
+    init();
     try {
       parse();
     } catch (ParseException e) {
@@ -286,6 +321,18 @@ public final class PHPParser extends PHPParserSuperclass {
     }
   }
 
+  /**
+   * Put a new html block in the stack.
+   */
+  public static final void createNewHTMLCode() {
+    final int currentPosition = SimpleCharStream.getPosition();
+    if (currentPosition == htmlStart) {
+      return;
+    }
+    final char[] chars = SimpleCharStream.currentBuffer.substring(htmlStart,currentPosition).toCharArray();
+    pushOnAstNodes(new HTMLCode(chars, htmlStart,currentPosition));
+  }
+
   private static final void parse() throws ParseException {
          phpFile();
   }
@@ -295,14 +342,14 @@ PARSER_END(PHPParser)
 
 <DEFAULT> TOKEN :
 {
-  <PHPSTARTSHORT : "<?">   : PHPPARSING
-| <PHPSTARTLONG : "<?php"> : PHPPARSING
-| <PHPECHOSTART : "<?=">   : PHPPARSING
+  <PHPSTARTSHORT : "<?">    {PHPParser.createNewHTMLCode();} : PHPPARSING
+| <PHPSTARTLONG  : "<?php"> {PHPParser.createNewHTMLCode();} : PHPPARSING
+| <PHPECHOSTART  : "<?=">   {PHPParser.createNewHTMLCode();} : PHPPARSING
 }
 
 <PHPPARSING> TOKEN :
 {
-  <PHPEND :"?>"> : DEFAULT
+  <PHPEND :"?>"> {PHPParser.htmlStart = SimpleCharStream.getPosition();} : DEFAULT
 }
 
 /* Skip any character if we are not in php mode */
@@ -435,10 +482,37 @@ MORE :
 | <INTEGER : "integer">
 }
 
+//Misc token
 <PHPPARSING> TOKEN :
 {
-  <_ORL  : "OR">
-| <_ANDL : "AND">
+  <AT                 : "@">
+| <DOLLAR             : "$">
+| <BANG               : "!">
+| <TILDE              : "~">
+| <HOOK               : "?">
+| <COLON              : ":">
+}
+
+/* OPERATORS */
+<PHPPARSING> TOKEN :
+{
+  <OR_OR              : "||">
+| <AND_AND            : "&&">
+| <INCR               : "++">
+| <DECR               : "--">
+| <PLUS               : "+">
+| <MINUS              : "-">
+| <STAR               : "*">
+| <SLASH              : "/">
+| <BIT_AND            : "&">
+| <BIT_OR             : "|">
+| <XOR                : "^">
+| <REMAINDER          : "%">
+| <LSHIFT             : "<<">
+| <RSIGNEDSHIFT       : ">>">
+| <RUNSIGNEDSHIFT     : ">>>">
+| <_ORL               : "OR">
+| <_ANDL              : "AND">
 }
 
 /* LITERALS */
@@ -535,10 +609,10 @@ MORE :
 {
   <GT                 : ">">
 | <LT                 : "<">
-| <EQ                 : "==">
+| <EQUAL_EQUAL        : "==">
 | <LE                 : "<=">
 | <GE                 : ">=">
-| <NE                 : "!=">
+| <NOT_EQUAL          : "!=">
 | <DIF                : "<>">
 | <BANGDOUBLEEQUAL    : "!==">
 | <TRIPLEEQUAL        : "===">
@@ -558,32 +632,6 @@ MORE :
 | <DOTASSIGN          : ".=">
 | <REMASSIGN          : "%=">
 | <TILDEEQUAL         : "~=">
-}
-
-/* OPERATORS */
-<PHPPARSING> TOKEN :
-{
-  <AT                 : "@">
-| <DOLLAR             : "$">
-| <BANG               : "!">
-| <TILDE              : "~">
-| <HOOK               : "?">
-| <COLON              : ":">
-| <SC_OR              : "||">
-| <SC_AND             : "&&">
-| <INCR               : "++">
-| <DECR               : "--">
-| <PLUS               : "+">
-| <MINUS              : "-">
-| <STAR               : "*">
-| <SLASH              : "/">
-| <BIT_AND            : "&">
-| <BIT_OR             : "|">
-| <XOR                : "^">
-| <REM                : "%">
-| <LSHIFT             : "<<">
-| <RSIGNEDSHIFT       : ">>">
-| <RUNSIGNEDSHIFT     : ">>>">
 | <LSHIFTASSIGN       : "<<=">
 | <RSIGNEDSHIFTASSIGN : ">>=">
 }
@@ -598,6 +646,7 @@ void phpTest() :
 {
   Php()
   <EOF>
+  {PHPParser.createNewHTMLCode();}
 }
 
 void phpFile() :
@@ -653,10 +702,18 @@ void PhpBlock() :
   }
 }
 
-void phpEchoBlock() :
-{}
+PHPEchoBlock phpEchoBlock() :
 {
-  <PHPECHOSTART> Expression() [ <SEMICOLON> ] <PHPEND>
+  final Expression expr;
+  final int pos = SimpleCharStream.getPosition();
+  PHPEchoBlock echoBlock;
+}
+{
+  <PHPECHOSTART> expr = Expression() [ <SEMICOLON> ] <PHPEND>
+  {
+  echoBlock = new PHPEchoBlock(expr,pos,SimpleCharStream.getPosition());
+  pushOnAstNodes(echoBlock);
+  return echoBlock;}
 }
 
 void Php() :
@@ -665,10 +722,11 @@ void Php() :
   (BlockStatement())*
 }
 
-void ClassDeclaration() :
+ClassDeclaration ClassDeclaration() :
 {
-  final PHPClassDeclaration classDeclaration;
+  final ClassDeclaration classDeclaration;
   final Token className;
+  Token superclassName = null;
   final int pos;
 }
 {
@@ -686,7 +744,7 @@ void ClassDeclaration() :
   [
     <EXTENDS>
     try {
-      <IDENTIFIER>
+      superclassName = <IDENTIFIER>
     } catch (ParseException e) {
       errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', identifier expected";
       errorLevel   = ERROR;
@@ -696,21 +754,29 @@ void ClassDeclaration() :
     }
   ]
   {
-    if (currentSegment != null) {
-      classDeclaration = new PHPClassDeclaration(currentSegment,className.image,pos);
+    if (superclassName == null) {
+      classDeclaration = new ClassDeclaration(currentSegment,
+                                              className.image.toCharArray(),
+                                              superclassName.image.toCharArray(),
+                                              pos,
+                                              0);
+    } else {
+      classDeclaration = new ClassDeclaration(currentSegment,
+                                              className.image.toCharArray(),
+                                              pos,
+                                              0);
+    }
       currentSegment.add(classDeclaration);
       currentSegment = classDeclaration;
-    }
-  }
-  ClassBody()
-  {
-    if (currentSegment != null) {
-      currentSegment = (PHPSegmentWithChildren) currentSegment.getParent();
-    }
   }
+  ClassBody(classDeclaration)
+  {currentSegment = (OutlineableWithChildren) currentSegment.getParent();
+   classDeclaration.sourceEnd = SimpleCharStream.getPosition();
+   pushOnAstNodes(classDeclaration);
+   return classDeclaration;}
 }
 
-void ClassBody() :
+void ClassBody(ClassDeclaration classDeclaration) :
 {}
 {
   try {
@@ -722,7 +788,7 @@ void ClassBody() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  ( ClassBodyDeclaration() )*
+  ( ClassBodyDeclaration(classDeclaration) )*
   try {
     <RBRACE>
   } catch (ParseException e) {
@@ -737,24 +803,27 @@ void ClassBody() :
 /**
  * A class can contain only methods and fields.
  */
-void ClassBodyDeclaration() :
-{}
+void ClassBodyDeclaration(ClassDeclaration classDeclaration) :
 {
-  MethodDeclaration()
-| FieldDeclaration()
+  MethodDeclaration method;
+  FieldDeclaration field;
+}
+{
+  method = MethodDeclaration() {classDeclaration.addMethod(method);}
+| field = FieldDeclaration()   {classDeclaration.addVariable(field);}
 }
 
 /**
  * A class field declaration : it's var VariableDeclarator() (, VariableDeclarator())*;.
  */
-void FieldDeclaration() :
+FieldDeclaration FieldDeclaration() :
 {
-  PHPVarDeclaration variableDeclaration;
+  VariableDeclaration variableDeclaration;
 }
 {
   <VAR> variableDeclaration = VariableDeclarator()
   {
-    outlineInfo.addVariable(variableDeclaration.getVariable().getName());
+    outlineInfo.addVariable(new String(variableDeclaration.name));
     if (currentSegment != null) {
       currentSegment.add(variableDeclaration);
     }
@@ -778,9 +847,10 @@ void FieldDeclaration() :
   }
 }
 
-PHPVarDeclaration VariableDeclarator() :
+VariableDeclaration VariableDeclarator() :
 {
   final String varName, varValue;
+  Expression initializer = null;
   final int pos = jj_input_stream.getPosition();
 }
 {
@@ -788,8 +858,7 @@ PHPVarDeclaration VariableDeclarator() :
   [
     <ASSIGN>
     try {
-      varValue = VariableInitializer()
-      {return new PHPVarDeclaration(currentSegment,varName,pos,varValue);}
+      initializer = VariableInitializer()
     } catch (ParseException e) {
       errorMessage = "Literal expression expected in variable initializer";
       errorLevel   = ERROR;
@@ -798,19 +867,33 @@ PHPVarDeclaration VariableDeclarator() :
       throw e;
     }
   ]
-  {return new PHPVarDeclaration(currentSegment,varName,pos);}
+  {return new VariableDeclaration(currentSegment,
+                                  varName.toCharArray(),
+                                  initializer,
+                                  pos);}
 }
 
+/**
+ * A Variable name.
+ * @return the variable name (with suffix)
+ */
 String VariableDeclaratorId() :
 {
   String expr;
+  Expression expression;
   final StringBuffer buff = new StringBuffer();
+  final int pos = SimpleCharStream.getPosition();
+  ConstantIdentifier ex;
 }
 {
   try {
     expr = Variable()   {buff.append(expr);}
     ( LOOKAHEAD(2)
-      expr = VariableSuffix() {buff.append(expr);}
+      {ex = new ConstantIdentifier(expr.toCharArray(),
+                                   pos,
+                                   SimpleCharStream.getPosition());}
+      expression = VariableSuffix(ex)
+      {buff.append(expression.toStringExpression());}
     )*
     {return buff.toString();}
   } catch (ParseException e) {
@@ -824,22 +907,22 @@ String VariableDeclaratorId() :
 
 String Variable():
 {
-  String expr = null;
+  final StringBuffer buff;
+  Expression expression = null;
   final Token token;
+  final String expr;
 }
 {
-  token = <DOLLAR_ID> [<LBRACE> expr = Expression() <RBRACE>]
+  token = <DOLLAR_ID> [<LBRACE> expression = Expression() <RBRACE>]
   {
-    if (expr == null && !assigning) {
-      if (currentFunction != null) {
-        PHPVarDeclaration var = currentFunction.getParameter(token.image.substring(1));
-        if (var != null) {
-          var.getVariable().setUsed(true);
-        }
-      }
+    if (expression == null && !assigning) {
       return token.image.substring(1);
     }
-    return token + "{" + expr + "}";
+    buff = new StringBuffer(token.image);
+    buff.append('{');
+    buff.append(expression.toStringExpression());
+    buff.append('}');
+    return buff.toString();
   }
 |
   <DOLLAR> expr = VariableName()
@@ -848,127 +931,113 @@ String Variable():
 
 String VariableName():
 {
-String expr = null;
-final Token token;
+  final StringBuffer buff;
+  String expr = null;
+  Expression expression = null;
+  final Token token;
 }
 {
-  <LBRACE> expr = Expression() <RBRACE>
-  {return "{"+expr+"}";}
+  <LBRACE> expression = Expression() <RBRACE>
+  {buff = new StringBuffer('{');
+   buff.append(expression.toStringExpression());
+   buff.append('}');
+   return buff.toString();}
 |
-  token = <IDENTIFIER> [<LBRACE> expr = Expression() <RBRACE>]
+  token = <IDENTIFIER> [<LBRACE> expression = Expression() <RBRACE>]
   {
-    if (expr == null) {
-      if (currentFunction != null) {
-        PHPVarDeclaration var = currentFunction.getParameter(token.image);
-        if (var != null) {
-          var.getVariable().setUsed(true);
-        }
-      }
+    if (expression == null) {
       return token.image;
     }
-    return token + "{" + expr + "}";
+    buff = new StringBuffer(token.image);
+    buff.append('{');
+    buff.append(expression.toStringExpression());
+    buff.append('}');
+    return buff.toString();
   }
 |
   <DOLLAR> expr = VariableName()
   {
-    if (currentFunction != null) {
-      PHPVarDeclaration var = currentFunction.getParameter(expr);
-      if (var != null) {
-        var.getVariable().setUsed(true);
-      }
-    }
-    return "$" + expr;
+    buff = new StringBuffer('$');
+    buff.append(expr);
+    return buff.toString();
   }
 |
-  token = <DOLLAR_ID>
-  {
-    if (currentFunction != null) {
-      PHPVarDeclaration var = currentFunction.getParameter(token.image.substring(1));
-      if (var != null) {
-        var.getVariable().setUsed(true);
-      }
-    }
-    return token.image + expr;
-  }
-/*|      pas besoin ?
-  token = <DOLLAR_ID> [expr = VariableName()]
-  {
-  if (expr == null) {
-    return token.image;
-  }
-  return token.image + expr;
-  }*/
+  token = <DOLLAR_ID> {return token.image;}
 }
 
-String VariableInitializer() :
+Expression VariableInitializer() :
 {
-  final String expr;
+  final Expression expr;
   final Token token;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
   expr = Literal()
   {return expr;}
 |
   <MINUS> (token = <INTEGER_LITERAL> | token = <FLOATING_POINT_LITERAL>)
-  {return "-" + token.image;}
+  {return new PrefixedUnaryExpression(new NumberLiteral(token.image.toCharArray(),
+                                                        pos,
+                                                        SimpleCharStream.getPosition()),
+                                      OperatorIds.MINUS,
+                                      pos);}
 |
   <PLUS> (token = <INTEGER_LITERAL> | token = <FLOATING_POINT_LITERAL>)
-  {return "+" + token.image;}
+  {return new PrefixedUnaryExpression(new NumberLiteral(token.image.toCharArray(),
+                                                        pos,
+                                                        SimpleCharStream.getPosition()),
+                                      OperatorIds.PLUS,
+                                      pos);}
 |
   expr = ArrayDeclarator()
   {return expr;}
 |
   token = <IDENTIFIER>
-  {return token.image;}
+  {return new ConstantIdentifier(token.image.toCharArray(),pos,SimpleCharStream.getPosition());}
 }
 
-String ArrayVariable() :
+ArrayVariableDeclaration ArrayVariable() :
 {
-String expr;
-final StringBuffer buff = new StringBuffer();
+Expression expr;
+Expression expr2 = null;
 }
 {
-  expr = Expression()
-  {buff.append(expr);}
-   [<ARRAYASSIGN> expr = Expression()
-   {buff.append("=>").append(expr);}]
-  {return buff.toString();}
+  expr = Expression() [<ARRAYASSIGN> expr2 = Expression()]
+  {return new ArrayVariableDeclaration(expr,expr2);}
 }
 
-String ArrayInitializer() :
+ArrayVariableDeclaration[] ArrayInitializer() :
 {
-String expr;
-final StringBuffer buff = new StringBuffer("(");
+  ArrayVariableDeclaration expr;
+  final ArrayList list = new ArrayList();
 }
 {
   <LPAREN> [ expr = ArrayVariable()
-            {buff.append(expr);}
+            {list.add(expr);}
             ( LOOKAHEAD(2) <COMMA> expr = ArrayVariable()
-            {buff.append(",").append(expr);}
+            {list.add(expr);}
             )*
            ]
-           [<COMMA> {buff.append(",");}]
+           [<COMMA> {list.add(null);}]
   <RPAREN>
-  {
-    buff.append(")");
-    return buff.toString();
-  }
+  {return (ArrayVariableDeclaration[]) list.toArray();}
 }
 
 /**
  * A Method Declaration.
  * <b>function</b> MetodDeclarator() Block()
  */
-void MethodDeclaration() :
+MethodDeclaration MethodDeclaration() :
 {
-  final PHPFunctionDeclaration functionDeclaration;
+  final MethodDeclaration functionDeclaration;
   Token functionToken;
+  final Block block;
 }
 {
   functionToken = <FUNCTION>
   try {
     functionDeclaration = MethodDeclarator()
-    {outlineInfo.addVariable(functionDeclaration.getName());}
+    {outlineInfo.addVariable(new String(functionDeclaration.name));}
   } catch (ParseException e) {
     if (errorMessage != null) {
       throw e;
@@ -986,28 +1055,14 @@ void MethodDeclaration() :
     }
     currentFunction = functionDeclaration;
   }
-  Block()
+  block = 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);
-        }
-      }
-    }
+    functionDeclaration.statements = block.statements;
     currentFunction = null;
     if (currentSegment != null) {
-      currentSegment = (PHPSegmentWithChildren) currentSegment.getParent();
+      currentSegment = (OutlineableWithChildren) currentSegment.getParent();
     }
+    return functionDeclaration;
   }
 }
 
@@ -1016,21 +1071,23 @@ void MethodDeclaration() :
  * [&] IDENTIFIER(parameters ...).
  * @return a function description for the outline
  */
-PHPFunctionDeclaration MethodDeclarator() :
+MethodDeclaration MethodDeclarator() :
 {
   final Token identifier;
-  final StringBuffer methodDeclaration = new StringBuffer();
+  Token reference = null;
   final Hashtable formalParameters;
-  final int pos = jj_input_stream.getPosition();
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  [ <BIT_AND> {methodDeclaration.append("&");} ]
+  [ reference = <BIT_AND> ]
   identifier = <IDENTIFIER>
   formalParameters = FormalParameters()
-  {
-    methodDeclaration.append(identifier);
-    return new PHPFunctionDeclaration(currentSegment,methodDeclaration.toString(),pos,formalParameters);
-  }
+  {return new MethodDeclaration(currentSegment,
+                                 identifier.image.toCharArray(),
+                                 formalParameters,
+                                 reference != null,
+                                 pos,
+                                 SimpleCharStream.getPosition());}
 }
 
 /**
@@ -1041,7 +1098,7 @@ Hashtable FormalParameters() :
 {
   String expr;
   final StringBuffer buff = new StringBuffer("(");
-  PHPVarDeclaration var;
+  VariableDeclaration var;
   final Hashtable parameters = new Hashtable();
 }
 {
@@ -1055,10 +1112,10 @@ Hashtable FormalParameters() :
     throw e;
   }
             [ var = FormalParameter()
-              {parameters.put(var.getVariable().getName(),var);}
+              {parameters.put(new String(var.name),var);}
               (
                 <COMMA> var = FormalParameter()
-                {parameters.put(var.getVariable().getName(),var);}
+                {parameters.put(new String(var.name),var);}
               )*
             ]
   try {
@@ -1077,40 +1134,55 @@ Hashtable FormalParameters() :
  * A formal parameter.
  * $varname[=value] (,$varname[=value])
  */
-PHPVarDeclaration FormalParameter() :
+VariableDeclaration FormalParameter() :
 {
-  final PHPVarDeclaration variableDeclaration;
+  final VariableDeclaration variableDeclaration;
   Token token = null;
 }
 {
   [token = <BIT_AND>] variableDeclaration = VariableDeclarator()
   {
     if (token != null) {
-      variableDeclaration.getVariable().setReference(true);
+      variableDeclaration.setReference(true);
     }
-    return variableDeclaration;
-  }
-}
-
-String Type() :
-{}
-{
-  <STRING>  {return "string";}
-| <BOOL>    {return "bool";}
-| <BOOLEAN> {return "boolean";}
-| <REAL>    {return "real";}
-| <DOUBLE>  {return "double";}
-| <FLOAT>   {return "float";}
-| <INT>     {return "int";}
-| <INTEGER> {return "integer";}
-| <OBJECT>  {return "object";}
-}
-
-String Expression() :
-{
-  final String expr;
-  final String assignOperator;
-  final String expr2;
+    return variableDeclaration;}
+}
+
+ConstantIdentifier Type() :
+{final int pos;}
+{
+  <STRING>             {pos = SimpleCharStream.getPosition();
+                        return new ConstantIdentifier(Types.STRING,
+                                        pos,pos-6);}
+| <BOOL>               {pos = SimpleCharStream.getPosition();
+                        return new ConstantIdentifier(Types.BOOL,
+                                        pos,pos-4);}
+| <BOOLEAN>            {pos = SimpleCharStream.getPosition();
+                        return new ConstantIdentifier(Types.BOOLEAN,
+                                        pos,pos-7);}
+| <REAL>               {pos = SimpleCharStream.getPosition();
+                        return new ConstantIdentifier(Types.REAL,
+                                        pos,pos-4);}
+| <DOUBLE>             {pos = SimpleCharStream.getPosition();
+                        return new ConstantIdentifier(Types.DOUBLE,
+                                        pos,pos-5);}
+| <FLOAT>              {pos = SimpleCharStream.getPosition();
+                        return new ConstantIdentifier(Types.FLOAT,
+                                        pos,pos-5);}
+| <INT>                {pos = SimpleCharStream.getPosition();
+                        return new ConstantIdentifier(Types.INT,
+                                        pos,pos-3);}
+| <INTEGER>            {pos = SimpleCharStream.getPosition();
+                        return new ConstantIdentifier(Types.INTEGER,
+                                        pos,pos-7);}
+| <OBJECT>             {pos = SimpleCharStream.getPosition();
+                        return new ConstantIdentifier(Types.OBJECT,
+                                        pos,pos-6);}
+}
+
+Expression Expression() :
+{
+  final Expression expr;
 }
 {
   expr = PrintExpression()       {return expr;}
@@ -1124,17 +1196,18 @@ String Expression() :
  * A Variable assignation.
  * varName (an assign operator) any expression
  */
-String varAssignation() :
+VarAssignation varAssignation() :
 {
-  String varName,assignOperator,expr2;
-  PHPVarDeclaration variable;
+  String varName;
+  final Expression expression;
+  final int assignOperator;
   final int pos = SimpleCharStream.getPosition();
 }
 {
   varName = VariableDeclaratorId()
   assignOperator = AssignmentOperator()
     try {
-      expr2 = Expression()
+      expression = Expression()
     } catch (ParseException e) {
       if (errorMessage != null) {
         throw e;
@@ -1145,300 +1218,286 @@ String varAssignation() :
       errorEnd   = jj_input_stream.getPosition() + 1;
       throw e;
     }
-    {return varName + assignOperator + expr2;}
+    {return new VarAssignation(varName.toCharArray(),
+                               expression,
+                               assignOperator,
+                               pos,
+                               SimpleCharStream.getPosition());}
 }
 
-String AssignmentOperator() :
+int AssignmentOperator() :
 {}
 {
-  <ASSIGN>             {return "=";}
-| <STARASSIGN>         {return "*=";}
-| <SLASHASSIGN>        {return "/=";}
-| <REMASSIGN>          {return "%=";}
-| <PLUSASSIGN>         {return "+=";}
-| <MINUSASSIGN>        {return "-=";}
-| <LSHIFTASSIGN>       {return "<<=";}
-| <RSIGNEDSHIFTASSIGN> {return ">>=";}
-| <ANDASSIGN>          {return "&=";}
-| <XORASSIGN>          {return "|=";}
-| <ORASSIGN>           {return "|=";}
-| <DOTASSIGN>          {return ".=";}
-| <TILDEEQUAL>         {return "~=";}
+  <ASSIGN>             {return VarAssignation.EQUAL;}
+| <STARASSIGN>         {return VarAssignation.STAR_EQUAL;}
+| <SLASHASSIGN>        {return VarAssignation.SLASH_EQUAL;}
+| <REMASSIGN>          {return VarAssignation.REM_EQUAL;}
+| <PLUSASSIGN>         {return VarAssignation.PLUS_EQUAL;}
+| <MINUSASSIGN>        {return VarAssignation.MINUS_EQUAL;}
+| <LSHIFTASSIGN>       {return VarAssignation.LSHIFT_EQUAL;}
+| <RSIGNEDSHIFTASSIGN> {return VarAssignation.RSIGNEDSHIFT_EQUAL;}
+| <ANDASSIGN>          {return VarAssignation.AND_EQUAL;}
+| <XORASSIGN>          {return VarAssignation.XOR_EQUAL;}
+| <ORASSIGN>           {return VarAssignation.OR_EQUAL;}
+| <DOTASSIGN>          {return VarAssignation.DOT_EQUAL;}
+| <TILDEEQUAL>         {return VarAssignation.TILDE_EQUAL;}
 }
 
-String ConditionalExpression() :
+Expression ConditionalExpression() :
 {
-  final String expr;
-  String expr2 = null;
-  String expr3 = null;
+  final Expression expr;
+  Expression expr2 = null;
+  Expression expr3 = null;
 }
 {
   expr = ConditionalOrExpression() [ <HOOK> expr2 = Expression() <COLON> expr3 = ConditionalExpression() ]
 {
   if (expr3 == null) {
     return expr;
-  } else {
-    return expr + "?" + expr2 + ":" + expr3;
   }
+  return new ConditionalExpression(expr,expr2,expr3);
 }
 }
 
-String ConditionalOrExpression() :
+Expression ConditionalOrExpression() :
 {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();
+  Expression expr,expr2;
+  int operator;
 }
 {
   expr = ConditionalAndExpression()
-  {buff.append(expr);}
   (
-    (operator = <SC_OR> | operator = <_ORL>) expr = ConditionalAndExpression()
+    (
+        <OR_OR> {operator = OperatorIds.OR_OR;}
+      | <_ORL>  {operator = OperatorIds.ORL;}
+    ) expr2 = ConditionalAndExpression()
     {
-      buff.append(operator.image);
-      buff.append(expr);
+      expr = new BinaryExpression(expr,expr2,operator);
     }
   )*
-  {
-    return buff.toString();
-  }
+  {return expr;}
 }
 
-String ConditionalAndExpression() :
+Expression ConditionalAndExpression() :
 {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();
+  Expression expr,expr2;
+  int operator;
 }
 {
   expr = ConcatExpression()
-  {buff.append(expr);}
   (
-  (operator = <SC_AND> | operator = <_ANDL>) expr = ConcatExpression()
-    {
-      buff.append(operator.image);
-      buff.append(expr);
-    }
+  (  <AND_AND> {operator = OperatorIds.AND_AND;}
+   | <_ANDL>   {operator = OperatorIds.ANDL;})
+   expr2 = ConcatExpression() {expr = new BinaryExpression(expr,expr2,operator);}
   )*
-  {return buff.toString();}
+  {return expr;}
 }
 
-String ConcatExpression() :
+Expression ConcatExpression() :
 {
-  String expr;
-  final StringBuffer buff = new StringBuffer();
+  Expression expr,expr2;
 }
 {
   expr = InclusiveOrExpression()
-  {buff.append(expr);}
   (
-  <DOT> expr = InclusiveOrExpression()
-  {buff.append(".").append(expr);}
+    <DOT> expr2 = InclusiveOrExpression()
+    {expr = new BinaryExpression(expr,expr2,OperatorIds.DOT);}
   )*
-  {return buff.toString();}
+  {return expr;}
 }
 
-String InclusiveOrExpression() :
+Expression InclusiveOrExpression() :
 {
-  String expr;
-  final StringBuffer buff = new StringBuffer();
+  Expression expr,expr2;
 }
 {
   expr = ExclusiveOrExpression()
-  {buff.append(expr);}
-  (
-  <BIT_OR> expr = ExclusiveOrExpression()
-  {buff.append("|").append(expr);}
+  (<BIT_OR> expr2 = ExclusiveOrExpression()
+   {expr = new BinaryExpression(expr,expr2,OperatorIds.OR);}
   )*
-  {return buff.toString();}
+  {return expr;}
 }
 
-String ExclusiveOrExpression() :
+Expression ExclusiveOrExpression() :
 {
-  String expr;
-  final StringBuffer buff = new StringBuffer();
+  Expression expr,expr2;
 }
 {
   expr = AndExpression()
-  {
-    buff.append(expr);
-  }
   (
-    <XOR> expr = AndExpression()
-  {
-    buff.append("^");
-    buff.append(expr);
-  }
+    <XOR> expr2 = AndExpression()
+    {expr = new BinaryExpression(expr,expr2,OperatorIds.XOR);}
   )*
-  {
-    return buff.toString();
-  }
+  {return expr;}
 }
 
-String AndExpression() :
+Expression AndExpression() :
 {
-  String expr;
-  final StringBuffer buff = new StringBuffer();
+  Expression expr,expr2;
 }
 {
   expr = EqualityExpression()
-  {
-    buff.append(expr);
-  }
   (
-    <BIT_AND> expr = EqualityExpression()
-  {
-    buff.append("&").append(expr);
-  }
+    <BIT_AND> expr2 = EqualityExpression()
+    {expr = new BinaryExpression(expr,expr2,OperatorIds.AND);}
   )*
-  {return buff.toString();}
+  {return expr;}
 }
 
-String EqualityExpression() :
+Expression EqualityExpression() :
 {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();
+  Expression expr,expr2;
+  int operator;
 }
 {
   expr = RelationalExpression()
-  {buff.append(expr);}
   (
-  (   operator = <EQ>
-    | operator = <DIF>
-    | operator = <NE>
-    | operator = <BANGDOUBLEEQUAL>
-    | operator = <TRIPLEEQUAL>
+  (   <EQUAL_EQUAL>      {operator = OperatorIds.EQUAL_EQUAL;}
+    | <DIF>              {operator = OperatorIds.DIF;}
+    | <NOT_EQUAL>        {operator = OperatorIds.DIF;}
+    | <BANGDOUBLEEQUAL>  {operator = OperatorIds.BANG_EQUAL_EQUAL;}
+    | <TRIPLEEQUAL>      {operator = OperatorIds.EQUAL_EQUAL_EQUAL;}
   )
   try {
-    expr = RelationalExpression()
+    expr2 = RelationalExpression()
   } catch (ParseException e) {
-    errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', expression expected after '"+operator.image+"'";
+    if (errorMessage != null) {
+      throw e;
+    }
+    errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', expression expected";
     errorLevel   = ERROR;
     errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
   {
-    buff.append(operator.image);
-    buff.append(expr);
+    expr = new BinaryExpression(expr,expr2,operator);
   }
   )*
-  {return buff.toString();}
+  {return expr;}
 }
 
-String RelationalExpression() :
+Expression RelationalExpression() :
 {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();
+  Expression expr,expr2;
+  int operator;
 }
 {
   expr = ShiftExpression()
-  {buff.append(expr);}
   (
-  ( operator = <LT> | operator = <GT> | operator = <LE> | operator = <GE> ) expr = ShiftExpression()
-  {buff.append(operator.image).append(expr);}
+  ( <LT> {operator = OperatorIds.LESS;}
+  | <GT> {operator = OperatorIds.GREATER;}
+  | <LE> {operator = OperatorIds.LESS_EQUAL;}
+  | <GE> {operator = OperatorIds.GREATER_EQUAL;})
+   expr2 = ShiftExpression()
+  {expr = new BinaryExpression(expr,expr2,operator);}
   )*
-  {return buff.toString();}
+  {return expr;}
 }
 
-String ShiftExpression() :
+Expression ShiftExpression() :
 {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();
+  Expression expr,expr2;
+  int operator;
 }
 {
   expr = AdditiveExpression()
-  {buff.append(expr);}
   (
-  (operator = <LSHIFT> | operator = <RSIGNEDSHIFT> | operator = <RUNSIGNEDSHIFT> ) expr = AdditiveExpression()
-  {
-    buff.append(operator.image);
-    buff.append(expr);
-  }
+  ( <LSHIFT>         {operator = OperatorIds.LEFT_SHIFT;}
+  | <RSIGNEDSHIFT>   {operator = OperatorIds.RIGHT_SHIFT;}
+  | <RUNSIGNEDSHIFT> {operator = OperatorIds.UNSIGNED_RIGHT_SHIFT;})
+  expr2 = AdditiveExpression()
+  {expr = new BinaryExpression(expr,expr2,operator);}
   )*
-  {return buff.toString();}
+  {return expr;}
 }
 
-String AdditiveExpression() :
+Expression AdditiveExpression() :
 {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();
+  Expression expr,expr2;
+  int operator;
 }
 {
   expr = MultiplicativeExpression()
-  {buff.append(expr);}
   (
-   ( operator = <PLUS> | operator = <MINUS> ) expr = MultiplicativeExpression()
-  {
-    buff.append(operator.image);
-    buff.append(expr);
-  }
+   ( <PLUS>  {operator = OperatorIds.PLUS;}
+   | <MINUS> {operator = OperatorIds.MINUS;} )
+   expr2 = MultiplicativeExpression()
+  {expr = new BinaryExpression(expr,expr2,operator);}
    )*
-  {return buff.toString();}
+  {return expr;}
 }
 
-String MultiplicativeExpression() :
+Expression MultiplicativeExpression() :
 {
-  String expr;
-  Token operator;
-  final StringBuffer buff = new StringBuffer();}
+  Expression expr,expr2;
+  int operator;
+}
 {
   try {
     expr = UnaryExpression()
   } catch (ParseException 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;
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  {buff.append(expr);}
   (
-    ( operator = <STAR> | operator = <SLASH> | operator = <REM> ) expr = UnaryExpression()
-    {
-      buff.append(operator.image);
-      buff.append(expr);
-    }
+   (  <STAR>      {operator = OperatorIds.MULTIPLY;}
+    | <SLASH>     {operator = OperatorIds.DIVIDE;}
+    | <REMAINDER> {operator = OperatorIds.REMAINDER;})
+    expr2 = UnaryExpression()
+    {expr = new BinaryExpression(expr,expr2,operator);}
   )*
-  {return buff.toString();}
+  {return expr;}
 }
 
 /**
  * An unary expression starting with @, & or nothing
  */
-String UnaryExpression() :
+Expression UnaryExpression() :
 {
-  final String expr;
-  final Token token;
-  final StringBuffer buff = new StringBuffer();
+  Expression expr;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  token = <BIT_AND> expr = UnaryExpressionNoPrefix()
-  {
-    if (token == null) {
-      return expr;
-    }
-    return token.image + expr;
-  }
-| (<AT> {buff.append("@");})*
+  <BIT_AND> expr = UnaryExpressionNoPrefix()
+  {return new PrefixedUnaryExpression(expr,OperatorIds.AND,pos);}
+|
+  expr = AtUnaryExpression()
+  {return expr;}
+}
+
+Expression AtUnaryExpression() :
+{
+  Expression expr;
+  final int pos = SimpleCharStream.getPosition();
+}
+{
+  <AT>
+  expr = AtUnaryExpression()
+  {return new PrefixedUnaryExpression(expr,OperatorIds.AT,pos);}
+|
   expr = UnaryExpressionNoPrefix()
-  {return buff.append(expr).toString();}
+  {return expr;}
 }
 
-String UnaryExpressionNoPrefix() :
+
+Expression UnaryExpressionNoPrefix() :
 {
-  final String expr;
-  final Token token;
+  Expression expr;
+  int operator;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  ( token = <PLUS> | token = <MINUS> ) expr = UnaryExpression()
-  {
-    return token.image + expr;
-  }
+  (  <PLUS>  {operator = OperatorIds.PLUS;}
+   | <MINUS> {operator = OperatorIds.MINUS;})
+   expr = UnaryExpression()
+  {return new PrefixedUnaryExpression(expr,operator,pos);}
 |
   expr = PreIncDecExpression()
   {return expr;}
@@ -1448,22 +1507,26 @@ String UnaryExpressionNoPrefix() :
 }
 
 
-String PreIncDecExpression() :
+Expression PreIncDecExpression() :
 {
-final String expr;
-final Token token;
+final Expression expr;
+final int operator;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  (token = <INCR> | token = <DECR>) expr = PrimaryExpression()
-  {return token.image + expr;}
+  (  <INCR> {operator = OperatorIds.PLUS_PLUS;}
+   | <DECR> {operator = OperatorIds.MINUS_MINUS;})
+   expr = PrimaryExpression()
+  {return new PrefixedUnaryExpression(expr,operator,pos);}
 }
 
-String UnaryExpressionNotPlusMinus() :
+Expression UnaryExpressionNotPlusMinus() :
 {
-  final String expr;
+  Expression expr;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  <BANG> expr = UnaryExpression() {return "!" + expr;}
+  <BANG> expr = UnaryExpression() {return new PrefixedUnaryExpression(expr,OperatorIds.NOT,pos);}
 | LOOKAHEAD( <LPAREN> (Type() | <ARRAY>) <RPAREN> )
   expr = CastExpression()         {return expr;}
 | expr = PostfixExpression()      {return expr;}
@@ -1478,114 +1541,146 @@ String UnaryExpressionNotPlusMinus() :
     errorEnd     = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  {return "("+expr+")";}
+  {return expr;}
 }
 
-String CastExpression() :
+CastExpression CastExpression() :
 {
-final String type, expr;
+final ConstantIdentifier type;
+final Expression expr;
+final int pos = SimpleCharStream.getPosition();
 }
 {
-  <LPAREN> (type = Type() | <ARRAY> {type = "array";}) <RPAREN> expr = UnaryExpression()
-  {return "(" + type + ")" + expr;}
+  <LPAREN>
+  (type = Type()
+  | <ARRAY> {type = new ConstantIdentifier(Types.ARRAY,pos,SimpleCharStream.getPosition());})
+  <RPAREN> expr = UnaryExpression()
+  {return new CastExpression(type,expr,pos,SimpleCharStream.getPosition());}
 }
 
-String PostfixExpression() :
+Expression PostfixExpression() :
 {
-  final String expr;
-  Token operator = null;
+  Expression expr;
+  int operator = -1;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  expr = PrimaryExpression() [ operator = <INCR> | operator = <DECR> ]
+  expr = PrimaryExpression()
+  [ <INCR> {operator = OperatorIds.PLUS_PLUS;}
+  | <DECR> {operator = OperatorIds.MINUS_MINUS;}]
   {
-    if (operator == null) {
+    if (operator == -1) {
       return expr;
     }
-    return expr + operator.image;
+    return new PostfixedUnaryExpression(expr,operator,pos);
   }
 }
 
-String PrimaryExpression() :
+Expression PrimaryExpression() :
 {
   final Token identifier;
-  String expr;
+  Expression expr;
   final StringBuffer buff = new StringBuffer();
+  final int pos = SimpleCharStream.getPosition();
 }
 {
   LOOKAHEAD(2)
   identifier = <IDENTIFIER> <STATICCLASSACCESS> expr = ClassIdentifier()
-  {buff.append(identifier.image).append("::").append(expr);}
-  (
-  expr = PrimarySuffix()
-  {buff.append(expr);}
-  )*
-  {return buff.toString();}
+  {expr = new ClassAccess(new ConstantIdentifier(identifier.image.toCharArray(),
+                                                 pos,
+                                                 SimpleCharStream.getPosition()),
+                          expr,
+                          ClassAccess.STATIC);}
+  (expr = PrimarySuffix(expr))*
+  {return expr;}
 |
-  expr = PrimaryPrefix()  {buff.append(expr);}
-  ( expr = PrimarySuffix()  {buff.append(expr);} )*
-  {return buff.toString();}
+  expr = PrimaryPrefix()
+  (expr = PrimarySuffix(expr))*
+  {return expr;}
 |
   expr = ArrayDeclarator()
-  {return "array" + expr;}
+  {return expr;}
 }
 
-String ArrayDeclarator() :
+ArrayInitializer ArrayDeclarator() :
 {
-  final String expr;
+  final ArrayVariableDeclaration[] vars;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  <ARRAY> expr = ArrayInitializer()
-  {return "array" + expr;}
+  <ARRAY> vars = ArrayInitializer()
+  {return new ArrayInitializer(vars,pos,SimpleCharStream.getPosition());}
 }
 
-String PrimaryPrefix() :
+Expression PrimaryPrefix() :
 {
-  final String expr;
+  final Expression expr;
   final Token token;
+  final String var;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  token = <IDENTIFIER>           {return token.image;}
-| <NEW> expr = ClassIdentifier() {return "new " + expr;}
-| expr = VariableDeclaratorId()  {return expr;}
+  token = <IDENTIFIER>           {return new ConstantIdentifier(token.image.toCharArray(),
+                                                                pos,
+                                                                SimpleCharStream.getPosition());}
+| <NEW> expr = ClassIdentifier() {return new PrefixedUnaryExpression(expr,
+                                                                     OperatorIds.NEW,
+                                                                     pos);}
+| var = VariableDeclaratorId()  {return new ConstantIdentifier(var.toCharArray(),
+                                                               pos,
+                                                               SimpleCharStream.getPosition());}
 }
 
-String classInstantiation() :
+PrefixedUnaryExpression classInstantiation() :
 {
-  String expr;
-  final StringBuffer buff = new StringBuffer("new ");
+  Expression expr;
+  final StringBuffer buff;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
   <NEW> expr = ClassIdentifier()
-  {buff.append(expr);}
   [
+    {buff = new StringBuffer(expr.toStringExpression());}
     expr = PrimaryExpression()
-    {buff.append(expr);}
+    {buff.append(expr.toStringExpression());
+    expr = new ConstantIdentifier(buff.toString().toCharArray(),
+                                  pos,
+                                  SimpleCharStream.getPosition());}
   ]
-  {return buff.toString();}
+  {return new PrefixedUnaryExpression(expr,
+                                      OperatorIds.NEW,
+                                      pos);}
 }
 
-String ClassIdentifier():
+ConstantIdentifier ClassIdentifier():
 {
   final String expr;
   final Token token;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  token = <IDENTIFIER>          {return token.image;}
-| expr = VariableDeclaratorId() {return expr;}
+  token = <IDENTIFIER>          {return new ConstantIdentifier(token.image.toCharArray(),
+                                                               pos,
+                                                               SimpleCharStream.getPosition());}
+| expr = VariableDeclaratorId() {return new ConstantIdentifier(expr.toCharArray(),
+                                                               pos,
+                                                               SimpleCharStream.getPosition());}
 }
 
-String PrimarySuffix() :
+AbstractSuffixExpression PrimarySuffix(Expression prefix) :
 {
-  final String expr;
+  final AbstractSuffixExpression expr;
 }
 {
-  expr = Arguments()      {return expr;}
-| expr = VariableSuffix() {return expr;}
+  expr = Arguments(prefix)      {return expr;}
+| expr = VariableSuffix(prefix) {return expr;}
 }
 
-String VariableSuffix() :
+AbstractSuffixExpression VariableSuffix(Expression prefix) :
 {
   String expr = null;
+  final int pos = SimpleCharStream.getPosition();
+  Expression expression = null;
 }
 {
   <CLASSACCESS>
@@ -1598,9 +1693,11 @@ String VariableSuffix() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  {return "->" + expr;}
+  {return new ClassAccess(prefix,
+                          new ConstantIdentifier(expr.toCharArray(),pos,SimpleCharStream.getPosition()),
+                          ClassAccess.NORMAL);}
 |
-  <LBRACKET> [ expr = Expression() | expr = Type() ]  //Not good
+  <LBRACKET> [ expression = Expression() | expression = Type() ]  //Not good
   try {
     <RBRACKET>
   } catch (ParseException e) {
@@ -1610,40 +1707,35 @@ String VariableSuffix() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  {
-    if(expr == null) {
-      return "[]";
-    }
-    return "[" + expr + "]";
-  }
+  {return new ArrayDeclarator(prefix,expression,SimpleCharStream.getPosition());}
 }
 
-String Literal() :
+Literal Literal() :
 {
-  final String expr;
   final Token token;
+  final int pos;
 }
 {
-  token = <INTEGER_LITERAL>        {return token.image;}
-| token = <FLOATING_POINT_LITERAL> {return token.image;}
-| token = <STRING_LITERAL>         {return token.image;}
-| expr = BooleanLiteral()          {return expr;}
-| <NULL>                           {return "null";}
-}
-
-String BooleanLiteral() :
-{}
-{
-  <TRUE>  {return "true";}
-| <FALSE> {return "false";}
+  token = <INTEGER_LITERAL>        {pos = SimpleCharStream.getPosition();
+                                    return new NumberLiteral(token.image.toCharArray(),pos-token.image.length(),pos);}
+| 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);}
+| <TRUE>                           {pos = SimpleCharStream.getPosition();
+                                    return new TrueLiteral(pos-4,pos);}
+| <FALSE>                          {pos = SimpleCharStream.getPosition();
+                                    return new FalseLiteral(pos-4,pos);}
+| <NULL>                           {pos = SimpleCharStream.getPosition();
+                                    return new NullLiteral(pos-4,pos);}
 }
 
-String Arguments() :
+FunctionCall Arguments(Expression func) :
 {
-String expr = null;
+ArgumentDeclaration[] args = null;
 }
 {
-  <LPAREN> [ expr = ArgumentList() ]
+  <LPAREN> [ args = ArgumentList() ]
   try {
     <RPAREN>
   } catch (ParseException e) {
@@ -1653,25 +1745,21 @@ String expr = null;
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  {
-  if (expr == null) {
-    return "()";
-  }
-  return "(" + expr + ")";
-  }
+  {return new FunctionCall(func,args,SimpleCharStream.getPosition());}
 }
 
-String ArgumentList() :
+ArgumentDeclaration[] ArgumentList() :
 {
-String expr;
-final StringBuffer buff = new StringBuffer();
+Expression expr;
+final ArrayList list = new ArrayList();
 }
 {
   expr = Expression()
-  {buff.append(expr);}
+  {list.add(expr);}
   ( <COMMA>
       try {
         expr = Expression()
+        {list.add(expr);}
       } catch (ParseException e) {
         errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. An expression expected after a comma in argument list";
         errorLevel   = ERROR;
@@ -1679,19 +1767,21 @@ final StringBuffer buff = new StringBuffer();
         errorEnd     = jj_input_stream.getPosition() + 1;
         throw e;
       }
-    {buff.append(",").append(expr);}
    )*
-   {return buff.toString();}
+   {return (ArgumentDeclaration[]) list.toArray();}
 }
 
 /**
  * A Statement without break.
  */
-void StatementNoBreak() :
-{}
+Statement StatementNoBreak() :
+{
+  final Statement statement;
+  Token token = null;
+}
 {
   LOOKAHEAD(2)
-  Expression()
+  statement = Expression()
   try {
     <SEMICOLON>
   } catch (ParseException e) {
@@ -1703,11 +1793,12 @@ void StatementNoBreak() :
       throw e;
     }
   }
+  {return statement;}
 | LOOKAHEAD(2)
-  LabeledStatement()
-| Block()
-| EmptyStatement()
-| StatementExpression()
+  statement = LabeledStatement() {return statement;}
+| statement = Block()            {return statement;}
+| statement = EmptyStatement()   {return statement;}
+| statement = StatementExpression()
   try {
     <SEMICOLON>
   } catch (ParseException e) {
@@ -1717,35 +1808,46 @@ void StatementNoBreak() :
     errorEnd     = jj_input_stream.getPosition() + 1;
     throw e;
   }
-| SwitchStatement()
-| IfStatement()
-| WhileStatement()
-| DoStatement()
-| ForStatement()
-| ForeachStatement()
-| ContinueStatement()
-| ReturnStatement()
-| EchoStatement()
-| [<AT>] IncludeStatement()
-| StaticStatement()
-| GlobalStatement()
+  {return statement;}
+| statement = SwitchStatement()         {return statement;}
+| statement = IfStatement()             {return statement;}
+| statement = WhileStatement()          {return statement;}
+| statement = DoStatement()             {return statement;}
+| statement = ForStatement()            {return statement;}
+| statement = ForeachStatement()        {return statement;}
+| statement = ContinueStatement()       {return statement;}
+| statement = ReturnStatement()         {return statement;}
+| statement = EchoStatement()           {return statement;}
+| [token=<AT>] statement = IncludeStatement()
+  {if (token != null) {
+    ((InclusionStatement)statement).silent = true;
+  }
+  return statement;}
+| statement = StaticStatement()         {return statement;}
+| statement = GlobalStatement()         {return statement;}
 }
 
 /**
  * A Normal statement.
  */
-void Statement() :
-{}
+Statement Statement() :
+{
+  final Statement statement;
+}
 {
-  StatementNoBreak()
-| BreakStatement()
+  statement = StatementNoBreak() {return statement;}
+| statement = BreakStatement()   {return statement;}
 }
 
 /**
  * An html block inside a php syntax.
  */
-void htmlBlock() :
-{}
+HTMLBlock htmlBlock() :
+{
+  final int startIndex = nodePtr;
+  AstNode[] blockNodes;
+  int nbNodes;
+}
 {
   <PHPEND> (phpEchoBlock())*
   try {
@@ -1757,38 +1859,46 @@ void htmlBlock() :
     errorEnd     = jj_input_stream.getPosition();
     throw e;
   }
+  {
+  nbNodes = nodePtr-startIndex;
+  blockNodes = new AstNode[nbNodes];
+  System.arraycopy(nodes,startIndex,blockNodes,0,nbNodes);
+  return new HTMLBlock(nodes);}
 }
 
 /**
  * An include statement. It's "include" an expression;
  */
-void IncludeStatement() :
+InclusionStatement IncludeStatement() :
 {
-  final String expr;
+  final Expression expr;
   final Token token;
+  final int keyword;
   final int pos = jj_input_stream.getPosition();
+  final InclusionStatement inclusionStatement;
 }
 {
-  (  token = <REQUIRE>
-   | token = <REQUIRE_ONCE>
-   | token = <INCLUDE>
-   | token = <INCLUDE_ONCE> )
-    try {
-      expr = Expression()
-    } catch (ParseException e) {
-      if (errorMessage != null) {
-        throw e;
-      }
-      errorMessage = "unexpected token '"+ e.currentToken.next.image+"', expression expected";
-      errorLevel   = ERROR;
-      errorStart   = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1;
-      errorEnd     = jj_input_stream.getPosition() + 1;
+      (  <REQUIRE>      {keyword = InclusionStatement.REQUIRE;}
+       | <REQUIRE_ONCE> {keyword = InclusionStatement.REQUIRE_ONCE;}
+       | <INCLUDE>      {keyword = InclusionStatement.INCLUDE;}
+       | <INCLUDE_ONCE> {keyword = InclusionStatement.INCLUDE_ONCE;})
+  try {
+    expr = Expression()
+  } catch (ParseException e) {
+    if (errorMessage != null) {
       throw e;
     }
-  {
-    if (currentSegment != null) {
-      currentSegment.add(new PHPReqIncDeclaration(currentSegment, token.image,pos,expr));
-    }
+    errorMessage = "unexpected token '"+ e.currentToken.next.image+"', expression expected";
+    errorLevel   = ERROR;
+    errorStart   = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1;
+    errorEnd     = jj_input_stream.getPosition() + 1;
+    throw e;
+  }
+  {inclusionStatement = new InclusionStatement(currentSegment,
+                                               keyword,
+                                               expr,
+                                               pos);
+   currentSegment.add(inclusionStatement);
   }
   try {
     <SEMICOLON>
@@ -1799,20 +1909,24 @@ void IncludeStatement() :
     errorEnd     = jj_input_stream.getPosition() + 1;
     throw e;
   }
+  {return inclusionStatement;}
 }
 
-String PrintExpression() :
+PrintExpression PrintExpression() :
 {
-  final String expr;
+  final Expression expr;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  <PRINT> expr = Expression() {return "print " + expr;}
+  <PRINT> expr = Expression() {return new PrintExpression(expr,pos,SimpleCharStream.getPosition());}
 }
 
-String ListExpression() :
+ListExpression ListExpression() :
 {
-  final StringBuffer buff = new StringBuffer("list(");
-  String expr;
+  String expr = null;
+  Expression expression = null;
+  ArrayList list = new ArrayList();
+  final int pos = SimpleCharStream.getPosition();
 }
 {
   <LIST>
@@ -1827,8 +1941,9 @@ String ListExpression() :
   }
   [
     expr = VariableDeclaratorId()
-    {buff.append(expr);}
+    {list.add(expr);}
   ]
+  {if (expr == null) list.add(null);}
   (
     try {
       <COMMA>
@@ -1840,9 +1955,8 @@ String ListExpression() :
       throw e;
     }
     expr = VariableDeclaratorId()
-    {buff.append(",").append(expr);}
+    {list.add(expr);}
   )*
-  {buff.append(")");}
   try {
     <RPAREN>
   } catch (ParseException e) {
@@ -1852,20 +1966,31 @@ String ListExpression() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  [ <ASSIGN> expr = Expression() {buff.append("(").append(expr);}]
-  {return buff.toString();}
+  [ <ASSIGN> expression = Expression()
+    {return new ListExpression((String[]) list.toArray(),expression,pos,SimpleCharStream.getPosition());}]
+  {return new ListExpression((String[]) list.toArray(),null,pos,SimpleCharStream.getPosition());}
 }
 
 /**
  * An echo statement.
  * echo anyexpression (, otherexpression)*
  */
-void EchoStatement() :
-{}
+EchoStatement EchoStatement() :
 {
-  <ECHO> Expression() (<COMMA> Expression())*
+  final ArrayList expressions = new ArrayList();
+  Expression expr;
+  final int pos = SimpleCharStream.getPosition();
+}
+{
+  <ECHO> expr = Expression()
+  {expressions.add(expr);}
+  (
+    <COMMA> expr = Expression()
+    {expressions.add(expr);}
+  )*
   try {
     <SEMICOLON>
+    {return new EchoStatement((Expression[]) expressions.toArray(),pos);}
   } catch (ParseException e) {
     if (e.currentToken.next.kind != 4) {
       errorMessage = "';' expected after 'echo' statement";
@@ -1877,25 +2002,29 @@ void EchoStatement() :
   }
 }
 
-void GlobalStatement() :
+GlobalStatement GlobalStatement() :
 {
    final int pos = jj_input_stream.getPosition();
    String expr;
+   ArrayList vars = new ArrayList();
+   GlobalStatement global;
 }
 {
   <GLOBAL>
     expr = VariableDeclaratorId()
-    {if (currentSegment != null) {
-      currentSegment.add(new PHPGlobalDeclaration(currentSegment, "global",pos,expr));
-    }}
+    {vars.add(expr);}
   (<COMMA>
     expr = VariableDeclaratorId()
-    {if (currentSegment != null) {
-      currentSegment.add(new PHPGlobalDeclaration(currentSegment, "global",pos,expr));
-    }}
+    {vars.add(expr);}
   )*
   try {
     <SEMICOLON>
+    {global = new GlobalStatement(currentSegment,
+                                  (String[]) vars.toArray(),
+                                  pos,
+                                  SimpleCharStream.getPosition());
+    currentSegment.add(global);
+    return global;}
   } catch (ParseException e) {
     errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. a ';' was expected";
     errorLevel   = ERROR;
@@ -1905,12 +2034,20 @@ void GlobalStatement() :
   }
 }
 
-void StaticStatement() :
-{}
+StaticStatement StaticStatement() :
 {
-  <STATIC> VariableDeclarator() (<COMMA> VariableDeclarator())*
+  final int pos = SimpleCharStream.getPosition();
+  final ArrayList vars = new ArrayList();
+  VariableDeclaration expr;
+}
+{
+  <STATIC> expr = VariableDeclarator() {vars.add(new String(expr.name));}
+  (<COMMA> expr = VariableDeclarator() {vars.add(new String(expr.name));})*
   try {
     <SEMICOLON>
+    {return new StaticStatement((String[])vars.toArray(),
+                                pos,
+                                SimpleCharStream.getPosition());}
   } catch (ParseException e) {
     errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. a ';' was expected";
     errorLevel   = ERROR;
@@ -1920,14 +2057,28 @@ void StaticStatement() :
   }
 }
 
-void LabeledStatement() :
-{}
+LabeledStatement LabeledStatement() :
+{
+  final int pos = SimpleCharStream.getPosition();
+  final Token label;
+  final Statement statement;
+}
 {
-  <IDENTIFIER> <COLON> Statement()
+  label = <IDENTIFIER> <COLON> statement = Statement()
+  {return new LabeledStatement(label.image.toCharArray(),statement,pos,SimpleCharStream.getPosition());}
 }
 
-void Block() :
-{}
+/**
+ * A Block is
+ * {
+ * statements
+ * }.
+ * @return a block
+ */
+Block Block() :
+{
+  final int pos = SimpleCharStream.getPosition();
+}
 {
   try {
     <LBRACE>
@@ -1950,57 +2101,84 @@ void Block() :
   }
 }
 
-void BlockStatement() :
-{}
+Statement BlockStatement() :
+{
+  final Statement statement;
+}
 {
-  Statement()
-| ClassDeclaration()
-| MethodDeclaration()
+  statement = Statement()         {return statement;}
+| statement = ClassDeclaration()  {return statement;}
+| statement = MethodDeclaration() {return statement;}
 }
 
 /**
  * A Block statement that will not contain any 'break'
  */
-void BlockStatementNoBreak() :
-{}
+Statement BlockStatementNoBreak() :
+{
+  final Statement statement;
+}
 {
-  StatementNoBreak()
-| ClassDeclaration()
-| MethodDeclaration()
+  statement = StatementNoBreak()  {return statement;}
+| statement = ClassDeclaration()  {return statement;}
+| statement = MethodDeclaration() {return statement;}
 }
 
-void LocalVariableDeclaration() :
-{}
+VariableDeclaration[] LocalVariableDeclaration() :
+{
+  final ArrayList list = new ArrayList();
+  VariableDeclaration var;
+}
 {
-  LocalVariableDeclarator() ( <COMMA> LocalVariableDeclarator() )*
+  var = LocalVariableDeclarator()
+  {list.add(var);}
+  ( <COMMA> var = LocalVariableDeclarator() {list.add(var);})*
+  {return (VariableDeclaration[]) list.toArray();}
 }
 
-void LocalVariableDeclarator() :
-{}
+VariableDeclaration LocalVariableDeclarator() :
 {
-  VariableDeclaratorId() [ <ASSIGN> Expression() ]
+  final String varName;
+  Expression init = null;
+  final int pos = SimpleCharStream.getPosition();
+}
+{
+  varName = VariableDeclaratorId() [ <ASSIGN> init = Expression() ]
+  {return new VariableDeclaration(varName.toCharArray(),init,pos);}
 }
 
-void EmptyStatement() :
-{}
+EmptyStatement EmptyStatement() :
+{
+  final int pos;
+}
 {
   <SEMICOLON>
+  {pos = SimpleCharStream.getPosition();
+   return new EmptyStatement(pos-1,pos);}
 }
 
-void StatementExpression() :
-{}
+Statement StatementExpression() :
+{
+  Expression expr;
+}
 {
-  PreIncDecExpression()
+  expr = PreIncDecExpression() {return expr;}
 |
-  PrimaryExpression()
-  [ <INCR>
-  | <DECR>
+  expr = PrimaryExpression()
+  [ <INCR> {expr = new PostfixedUnaryExpression(expr,
+                                                OperatorIds.PLUS_PLUS,
+                                                SimpleCharStream.getPosition());}
+  | <DECR> {expr = new PostfixedUnaryExpression(expr,
+                                                OperatorIds.MINUS_MINUS,
+                                                SimpleCharStream.getPosition());}
   | AssignmentOperator() Expression() ]
 }
 
-void SwitchStatement() :
+SwitchStatement SwitchStatement() :
 {
-  final int pos = jj_input_stream.getPosition();
+  final Expression variable;
+  final AbstractCase[] cases;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
   <SWITCH>
@@ -2014,7 +2192,7 @@ void SwitchStatement() :
     throw e;
   }
   try {
-    Expression()
+    variable = Expression()
   } catch (ParseException e) {
     if (errorMessage != null) {
       throw e;
@@ -2034,16 +2212,21 @@ void SwitchStatement() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  (switchStatementBrace() | switchStatementColon(pos, pos + 6))
+  (cases = switchStatementBrace() | cases = switchStatementColon(pos, pos + 6))
+  {return new SwitchStatement(variable,cases,pos,SimpleCharStream.getPosition());}
 }
 
-void switchStatementBrace() :
-{}
+AbstractCase[] switchStatementBrace() :
+{
+  AbstractCase cas;
+  final ArrayList cases = new ArrayList();
+}
 {
   <LBRACE>
- ( switchLabel0() )*
+ ( cas = switchLabel0() {cases.add(cas);})*
   try {
     <RBRACE>
+    {return (AbstractCase[]) cases.toArray();}
   } catch (ParseException e) {
     errorMessage = "'}' expected";
     errorLevel   = ERROR;
@@ -2057,8 +2240,11 @@ void switchStatementBrace() :
  * @param start the begin offset of the switch
  * @param end the end offset of the switch
  */
-void switchStatementColon(final int start, final int end) :
-{}
+AbstractCase[] switchStatementColon(final int start, final int end) :
+{
+  AbstractCase cas;
+  final ArrayList cases = new ArrayList();
+}
 {
   <COLON>
   {try {
@@ -2071,7 +2257,7 @@ void switchStatementColon(final int start, final int end) :
   } catch (CoreException e) {
     PHPeclipsePlugin.log(e);
   }}
-  (switchLabel0())*
+  ( cas = switchLabel0() {cases.add(cas);})*
   try {
     <ENDSWITCH>
   } catch (ParseException e) {
@@ -2083,6 +2269,7 @@ void switchStatementColon(final int start, final int end) :
   }
   try {
     <SEMICOLON>
+    {return (AbstractCase[]) cases.toArray();}
   } catch (ParseException e) {
     errorMessage = "';' expected after 'endswitch' keyword";
     errorLevel   = ERROR;
@@ -2092,56 +2279,39 @@ void switchStatementColon(final int start, final int end) :
   }
 }
 
-void switchLabel0() :
-{
-  Token breakToken = null;
-  final int line;
-}
-{
-  line = SwitchLabel()
-  ( BlockStatementNoBreak() | htmlBlock() )*
-  [ breakToken = BreakStatement() ]
-  {
-    try {
-      if (breakToken == null) {
-        setMarker(fileToParse,
-                  "You should use put a 'break' at the end of your statement",
-                  line,
-                  INFO,
-                  "Line " + line);
-      }
-    } catch (CoreException e) {
-      PHPeclipsePlugin.log(e);
-    }
-  }
-}
-
-Token BreakStatement() :
+AbstractCase switchLabel0() :
 {
-  final Token token;
+  final Expression expr;
+  Statement statement;
+  final ArrayList stmts = new ArrayList();
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  token = <BREAK> [ Expression() ]
-  try {
-    <SEMICOLON>
-  } catch (ParseException e) {
-    errorMessage = "';' expected after 'break' keyword";
-    errorLevel   = ERROR;
-    errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1;
-    errorEnd   = jj_input_stream.getPosition() + 1;
-    throw e;
+  expr = SwitchLabel()
+  ( 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());
   }
-  {return token;}
+  return new Case(expr,(Statement[]) stmts.toArray(),pos,SimpleCharStream.getPosition());}
 }
 
-int SwitchLabel() :
+/**
+ * A SwitchLabel.
+ * case Expression() :
+ * default :
+ * @return the if it was a case and null if not
+ */
+Expression SwitchLabel() :
 {
   final Token token;
+  final Expression expr;
 }
 {
   token = <CASE>
   try {
-    Expression()
+    expr = Expression()
   } catch (ParseException e) {
     if (errorMessage != null) throw e;
     errorMessage = "expression expected after 'case' keyword";
@@ -2152,6 +2322,7 @@ int SwitchLabel() :
   }
   try {
     <COLON>
+    {return expr;}
   } catch (ParseException e) {
     errorMessage = "':' expected after case expression";
     errorLevel   = ERROR;
@@ -2159,11 +2330,11 @@ int SwitchLabel() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  {return token.beginLine;}
 |
   token = <_DEFAULT>
   try {
     <COLON>
+    {return null;}
   } catch (ParseException e) {
     errorMessage = "':' expected after 'default' keyword";
     errorLevel   = ERROR;
@@ -2171,20 +2342,43 @@ int SwitchLabel() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  {return token.beginLine;}
 }
 
-void IfStatement() :
+Break BreakStatement() :
+{
+  Expression expression = null;
+  final int start = SimpleCharStream.getPosition();
+}
+{
+  <BREAK> [ expression = Expression() ]
+  try {
+    <SEMICOLON>
+  } catch (ParseException e) {
+    errorMessage = "';' expected after 'break' keyword";
+    errorLevel   = ERROR;
+    errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1;
+    errorEnd   = jj_input_stream.getPosition() + 1;
+    throw e;
+  }
+  {return new Break(expression, start, SimpleCharStream.getPosition());}
+}
+
+IfStatement IfStatement() :
 {
-  final Token token;
   final int pos = jj_input_stream.getPosition();
+  Expression condition;
+  IfStatement ifStatement;
 }
 {
-  token = <IF> Condition("if") IfStatement0(pos,pos+token.image.length())
+  <IF> condition = Condition("if") ifStatement = IfStatement0(condition, pos,pos+2)
+  {return ifStatement;}
 }
 
-void Condition(final String keyword) :
-{}
+
+Expression Condition(final String keyword) :
+{
+  final Expression condition;
+}
 {
   try {
     <LPAREN>
@@ -2195,9 +2389,10 @@ void Condition(final String keyword) :
     errorEnd   = errorStart +1;
     processParseException(e);
   }
-  Expression()
+  condition = Expression()
   try {
      <RPAREN>
+     {return condition;}
   } catch (ParseException e) {
     errorMessage = "')' expected after " + keyword + " keyword";
     errorLevel   = ERROR;
@@ -2207,10 +2402,21 @@ void Condition(final String keyword) :
   }
 }
 
-void IfStatement0(final int start,final int end) :
-{}
+IfStatement IfStatement0(Expression condition, final int start,final int end) :
+{
+  Statement statement;
+  ElseIf elseifStatement;
+  Else elseStatement = null;
+  ArrayList stmts = new ArrayList();
+  ArrayList elseifs = new ArrayList();
+  int pos = SimpleCharStream.getPosition();
+}
 {
-  <COLON> (Statement() | htmlBlock())* (ElseIfStatementColon())* [ElseStatementColon()]
+  <COLON>
+  (  statement = Statement() {stmts.add(statement);}
+   | statement = htmlBlock() {stmts.add(statement);})*
+   (elseifStatement = ElseIfStatementColon() {elseifs.add(elseifStatement);})*
+   [elseStatement = ElseStatementColon()]
 
   {try {
   setMarker(fileToParse,
@@ -2233,6 +2439,11 @@ void IfStatement0(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;
@@ -2241,12 +2452,15 @@ void IfStatement0(final int start,final int end) :
     throw e;
   }
 |
-  (Statement() |  htmlBlock())
-  ( LOOKAHEAD(1) ElseIfStatement() )*
+  (statement = Statement() | statement = htmlBlock())
+  {stmts.add(statement);}
+  ( LOOKAHEAD(1) elseifStatement = ElseIfStatement() {elseifs.add(elseifStatement);})*
   [ LOOKAHEAD(1)
     <ELSE>
     try {
-      Statement()
+      {pos = SimpleCharStream.getPosition();}
+      statement = Statement()
+      {elseStatement = new Else(statement,pos,SimpleCharStream.getPosition());}
     } catch (ParseException e) {
       if (errorMessage != null) {
         throw e;
@@ -2258,39 +2472,72 @@ void IfStatement0(final int start,final int end) :
       throw e;
     }
   ]
+  {return new IfStatement(condition,
+                          (ElseIf[]) elseifs.toArray(),
+                          elseStatement,
+                          pos,
+                          SimpleCharStream.getPosition());}
 }
 
-void ElseIfStatementColon() :
-{}
+ElseIf ElseIfStatementColon() :
 {
-  <ELSEIF> Condition("elseif") <COLON> (Statement() | htmlBlock())*
+  Expression condition;
+  Statement statement;
+  final ArrayList list = new ArrayList();
+  final int pos = SimpleCharStream.getPosition();
+}
+{
+  <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());}
 }
 
-void ElseStatementColon() :
-{}
+Else ElseStatementColon() :
 {
-  <ELSE> <COLON> (Statement() | htmlBlock())*
+  Statement statement;
+  final ArrayList list = new ArrayList();
+  final int pos = SimpleCharStream.getPosition();
+}
+{
+  <ELSE> <COLON> (  statement = Statement() {list.add(statement);}
+                  | statement = htmlBlock() {list.add(statement);})*
+  {return new Else((Statement[]) list.toArray(),pos,SimpleCharStream.getPosition());}
 }
 
-void ElseIfStatement() :
-{}
+ElseIf ElseIfStatement() :
 {
-  <ELSEIF> Condition("elseif") Statement()
+  Expression condition;
+  Statement statement;
+  final ArrayList list = new ArrayList();
+  final int pos = SimpleCharStream.getPosition();
+}
+{
+  <ELSEIF> condition = Condition("elseif") statement = Statement() {list.add(statement);/*todo:do better*/}
+  {return new ElseIf(condition,(Statement[]) list.toArray(),pos,SimpleCharStream.getPosition());}
 }
 
-void WhileStatement() :
+WhileStatement WhileStatement() :
 {
-  final Token token;
-  final int pos = jj_input_stream.getPosition();
+  final Expression condition;
+  final Statement action;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  token = <WHILE> Condition("while") WhileStatement0(pos,pos + token.image.length())
+  <WHILE>
+    condition = Condition("while")
+    action    = WhileStatement0(pos,pos + 5)
+    {return new WhileStatement(condition,action,pos,SimpleCharStream.getPosition());}
 }
 
-void WhileStatement0(final int start, final int end) :
-{}
+Statement WhileStatement0(final int start, final int end) :
 {
-  <COLON> (Statement())*
+  Statement statement;
+  final ArrayList stmts = new ArrayList();
+  final int pos = SimpleCharStream.getPosition();
+}
+{
+  <COLON> (statement = Statement() {stmts.add(statement);})*
   {try {
   setMarker(fileToParse,
             "Ugly syntax detected, you should while () {...} instead of while (): ... endwhile;",
@@ -2312,6 +2559,7 @@ void WhileStatement0(final int start, final int end) :
   }
   try {
     <SEMICOLON>
+    {return new Block((Statement[]) stmts.toArray(),pos,SimpleCharStream.getPosition());}
   } catch (ParseException e) {
     errorMessage = "';' expected after 'endwhile' keyword";
     errorLevel   = ERROR;
@@ -2320,15 +2568,21 @@ void WhileStatement0(final int start, final int end) :
     throw e;
   }
 |
-  Statement()
+  statement = Statement()
+  {return statement;}
 }
 
-void DoStatement() :
-{}
+DoStatement DoStatement() :
+{
+  final Statement action;
+  final Expression condition;
+  final int pos = SimpleCharStream.getPosition();
+}
 {
-  <DO> Statement() <WHILE> Condition("while")
+  <DO> action = Statement() <WHILE> condition = Condition("while")
   try {
     <SEMICOLON>
+    {return new DoStatement(condition,action,pos,SimpleCharStream.getPosition());}
   } catch (ParseException e) {
     errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected";
     errorLevel   = ERROR;
@@ -2338,8 +2592,14 @@ void DoStatement() :
   }
 }
 
-void ForeachStatement() :
-{}
+ForeachStatement ForeachStatement() :
+{
+  Statement statement;
+  Expression expression;
+  final StringBuffer buff = new StringBuffer();
+  final int pos = SimpleCharStream.getPosition();
+  ArrayVariableDeclaration variable;
+}
 {
   <FOREACH>
     try {
@@ -2352,7 +2612,7 @@ void ForeachStatement() :
     throw e;
   }
   try {
-    Variable()
+    expression = Expression()
   } catch (ParseException e) {
     errorMessage = "variable expected";
     errorLevel   = ERROR;
@@ -2360,7 +2620,6 @@ void ForeachStatement() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  ( VariableSuffix() )*
   try {
     <AS>
   } catch (ParseException e) {
@@ -2371,7 +2630,7 @@ void ForeachStatement() :
     throw e;
   }
   try {
-    Variable()
+    variable = ArrayVariable()
   } catch (ParseException e) {
     errorMessage = "variable expected";
     errorLevel   = ERROR;
@@ -2379,7 +2638,6 @@ void ForeachStatement() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-  [ <ARRAYASSIGN> Expression() ]
   try {
     <RPAREN>
   } catch (ParseException e) {
@@ -2390,7 +2648,7 @@ void ForeachStatement() :
     throw e;
   }
   try {
-    Statement()
+    statement = Statement()
   } catch (ParseException e) {
     if (errorMessage != null) throw e;
     errorMessage = "statement expected";
@@ -2399,12 +2657,24 @@ void ForeachStatement() :
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
+  {return new ForeachStatement(expression,
+                               variable,
+                               statement,
+                               pos,
+                               SimpleCharStream.getPosition());}
+
 }
 
-void ForStatement() :
+ForStatement ForStatement() :
 {
 final Token token;
-final int pos = jj_input_stream.getPosition();
+final int pos = SimpleCharStream.getPosition();
+Statement[] initializations = null;
+Expression condition = null;
+Statement[] increments = null;
+Statement action;
+final ArrayList list = new ArrayList();
+final int startBlock, endBlock;
 }
 {
   token = <FOR>
@@ -2417,11 +2687,16 @@ final int pos = jj_input_stream.getPosition();
     errorEnd   = jj_input_stream.getPosition() + 1;
     throw e;
   }
-     [ ForInit() ] <SEMICOLON> [ Expression() ] <SEMICOLON> [ StatementExpressionList() ] <RPAREN>
+     [ initializations = ForInit() ] <SEMICOLON>
+     [ condition = Expression() ] <SEMICOLON>
+     [ increments = StatementExpressionList() ] <RPAREN>
     (
-      Statement()
+      action = Statement()
+      {return new ForStatement(initializations,condition,increments,action,pos,SimpleCharStream.getPosition());}
     |
-      <COLON> (Statement())*
+      <COLON>
+      {startBlock = SimpleCharStream.getPosition();}
+      (action = Statement() {list.add(action);})*
       {
         try {
         setMarker(fileToParse,
@@ -2434,6 +2709,7 @@ final int pos = jj_input_stream.getPosition();
           PHPeclipsePlugin.log(e);
         }
       }
+      {endBlock = SimpleCharStream.getPosition();}
       try {
         <ENDFOR>
       } catch (ParseException e) {
@@ -2445,6 +2721,7 @@ final int pos = jj_input_stream.getPosition();
       }
       try {
         <SEMICOLON>
+        {return new ForStatement(initializations,condition,increments,new Block((Statement[])list.toArray(),startBlock,endBlock),pos,SimpleCharStream.getPosition());}
       } catch (ParseException e) {
         errorMessage = "';' expected after 'endfor' keyword";
         errorLevel   = ERROR;
@@ -2455,27 +2732,40 @@ final int pos = jj_input_stream.getPosition();
     )
 }
 
-void ForInit() :
-{}
+Statement[] ForInit() :
+{
+  Statement[] statements;
+}
 {
   LOOKAHEAD(LocalVariableDeclaration())
-  LocalVariableDeclaration()
+  statements = LocalVariableDeclaration()
+  {return statements;}
 |
-  StatementExpressionList()
+  statements = StatementExpressionList()
+  {return statements;}
 }
 
-void StatementExpressionList() :
-{}
+Statement[] StatementExpressionList() :
 {
-  StatementExpression() ( <COMMA> StatementExpression() )*
+  final ArrayList list = new ArrayList();
+  Statement expr;
+}
+{
+  expr = StatementExpression()   {list.add(expr);}
+  (<COMMA> StatementExpression() {list.add(expr);})*
+  {return (Statement[]) list.toArray();}
 }
 
-void ContinueStatement() :
-{}
+Continue ContinueStatement() :
 {
-  <CONTINUE> [ Expression() ]
+  Expression expr = null;
+  final int pos = SimpleCharStream.getPosition();
+}
+{
+  <CONTINUE> [ expr = Expression() ]
   try {
     <SEMICOLON>
+    {return new Continue(expr,pos,SimpleCharStream.getPosition());}
   } catch (ParseException e) {
     errorMessage = "';' expected after 'continue' statement";
     errorLevel   = ERROR;
@@ -2485,12 +2775,16 @@ void ContinueStatement() :
   }
 }
 
-void ReturnStatement() :
-{}
+ReturnStatement ReturnStatement() :
+{
+  Expression expr = null;
+  final int pos = SimpleCharStream.getPosition();
+}
 {
-  <RETURN> [ Expression() ]
+  <RETURN> [ expr = Expression() ]
   try {
     <SEMICOLON>
+    {return new ReturnStatement(expr,pos,SimpleCharStream.getPosition());}
   } catch (ParseException e) {
     errorMessage = "';' expected after 'return' statement";
     errorLevel   = ERROR;
index 99de374..00c5d6a 100644 (file)
@@ -64,72 +64,72 @@ public interface PHPParserConstants {
   int FLOAT = 69;
   int INT = 70;
   int INTEGER = 71;
-  int _ORL = 72;
-  int _ANDL = 73;
-  int INTEGER_LITERAL = 74;
-  int DECIMAL_LITERAL = 75;
-  int HEX_LITERAL = 76;
-  int OCTAL_LITERAL = 77;
-  int FLOATING_POINT_LITERAL = 78;
-  int EXPONENT = 79;
-  int STRING_LITERAL = 80;
-  int STRING_1 = 81;
-  int STRING_2 = 82;
-  int STRING_3 = 83;
-  int IDENTIFIER = 84;
-  int LETTER = 85;
-  int DIGIT = 86;
-  int SPECIAL = 87;
-  int LPAREN = 88;
-  int RPAREN = 89;
-  int LBRACE = 90;
-  int RBRACE = 91;
-  int LBRACKET = 92;
-  int RBRACKET = 93;
-  int SEMICOLON = 94;
-  int COMMA = 95;
-  int DOT = 96;
-  int GT = 97;
-  int LT = 98;
-  int EQ = 99;
-  int LE = 100;
-  int GE = 101;
-  int NE = 102;
-  int DIF = 103;
-  int BANGDOUBLEEQUAL = 104;
-  int TRIPLEEQUAL = 105;
-  int ASSIGN = 106;
-  int PLUSASSIGN = 107;
-  int MINUSASSIGN = 108;
-  int STARASSIGN = 109;
-  int SLASHASSIGN = 110;
-  int ANDASSIGN = 111;
-  int ORASSIGN = 112;
-  int XORASSIGN = 113;
-  int DOTASSIGN = 114;
-  int REMASSIGN = 115;
-  int TILDEEQUAL = 116;
-  int AT = 117;
-  int DOLLAR = 118;
-  int BANG = 119;
-  int TILDE = 120;
-  int HOOK = 121;
-  int COLON = 122;
-  int SC_OR = 123;
-  int SC_AND = 124;
-  int INCR = 125;
-  int DECR = 126;
-  int PLUS = 127;
-  int MINUS = 128;
-  int STAR = 129;
-  int SLASH = 130;
-  int BIT_AND = 131;
-  int BIT_OR = 132;
-  int XOR = 133;
-  int REM = 134;
-  int LSHIFT = 135;
-  int RSIGNEDSHIFT = 136;
-  int RUNSIGNEDSHIFT = 137;
+  int AT = 72;
+  int DOLLAR = 73;
+  int BANG = 74;
+  int TILDE = 75;
+  int HOOK = 76;
+  int COLON = 77;
+  int OR_OR = 78;
+  int AND_AND = 79;
+  int INCR = 80;
+  int DECR = 81;
+  int PLUS = 82;
+  int MINUS = 83;
+  int STAR = 84;
+  int SLASH = 85;
+  int BIT_AND = 86;
+  int BIT_OR = 87;
+  int XOR = 88;
+  int REMAINDER = 89;
+  int LSHIFT = 90;
+  int RSIGNEDSHIFT = 91;
+  int RUNSIGNEDSHIFT = 92;
+  int _ORL = 93;
+  int _ANDL = 94;
+  int INTEGER_LITERAL = 95;
+  int DECIMAL_LITERAL = 96;
+  int HEX_LITERAL = 97;
+  int OCTAL_LITERAL = 98;
+  int FLOATING_POINT_LITERAL = 99;
+  int EXPONENT = 100;
+  int STRING_LITERAL = 101;
+  int STRING_1 = 102;
+  int STRING_2 = 103;
+  int STRING_3 = 104;
+  int IDENTIFIER = 105;
+  int LETTER = 106;
+  int DIGIT = 107;
+  int SPECIAL = 108;
+  int LPAREN = 109;
+  int RPAREN = 110;
+  int LBRACE = 111;
+  int RBRACE = 112;
+  int LBRACKET = 113;
+  int RBRACKET = 114;
+  int SEMICOLON = 115;
+  int COMMA = 116;
+  int DOT = 117;
+  int GT = 118;
+  int LT = 119;
+  int EQUAL_EQUAL = 120;
+  int LE = 121;
+  int GE = 122;
+  int NOT_EQUAL = 123;
+  int DIF = 124;
+  int BANGDOUBLEEQUAL = 125;
+  int TRIPLEEQUAL = 126;
+  int ASSIGN = 127;
+  int PLUSASSIGN = 128;
+  int MINUSASSIGN = 129;
+  int STARASSIGN = 130;
+  int SLASHASSIGN = 131;
+  int ANDASSIGN = 132;
+  int ORASSIGN = 133;
+  int XORASSIGN = 134;
+  int DOTASSIGN = 135;
+  int REMASSIGN = 136;
+  int TILDEEQUAL = 137;
   int LSHIFTASSIGN = 138;
   int RSIGNEDSHIFTASSIGN = 139;
   int DOLLAR_ID = 140;
@@ -213,6 +213,27 @@ public interface PHPParserConstants {
     "\"float\"",
     "\"int\"",
     "\"integer\"",
+    "\"@\"",
+    "\"$\"",
+    "\"!\"",
+    "\"~\"",
+    "\"?\"",
+    "\":\"",
+    "\"||\"",
+    "\"&&\"",
+    "\"++\"",
+    "\"--\"",
+    "\"+\"",
+    "\"-\"",
+    "\"*\"",
+    "\"/\"",
+    "\"&\"",
+    "\"|\"",
+    "\"^\"",
+    "\"%\"",
+    "\"<<\"",
+    "\">>\"",
+    "\">>>\"",
     "\"OR\"",
     "\"AND\"",
     "<INTEGER_LITERAL>",
@@ -258,27 +279,6 @@ public interface PHPParserConstants {
     "\".=\"",
     "\"%=\"",
     "\"~=\"",
-    "\"@\"",
-    "\"$\"",
-    "\"!\"",
-    "\"~\"",
-    "\"?\"",
-    "\":\"",
-    "\"||\"",
-    "\"&&\"",
-    "\"++\"",
-    "\"--\"",
-    "\"+\"",
-    "\"-\"",
-    "\"*\"",
-    "\"/\"",
-    "\"&\"",
-    "\"|\"",
-    "\"^\"",
-    "\"%\"",
-    "\"<<\"",
-    "\">>\"",
-    "\">>>\"",
     "\"<<=\"",
     "\">>=\"",
     "<DOLLAR_ID>",
index bffc8ef..016518a 100644 (file)
@@ -7,13 +7,15 @@ import org.eclipse.ui.texteditor.MarkerUtilities;
 import org.eclipse.jface.preference.IPreferenceStore;
 import java.util.Hashtable;
 import java.util.Enumeration;
+import java.util.ArrayList;
 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.*;
 import net.sourceforge.phpdt.internal.compiler.ast.*;
+import net.sourceforge.phpdt.internal.compiler.parser.OutlineableWithChildren;
+import net.sourceforge.phpdt.internal.compiler.parser.PHPOutlineInfo;
 
 public class PHPParserTokenManager implements PHPParserConstants
 {
@@ -299,41 +301,41 @@ private static final int jjStopStringLiteralDfa_1(int pos, long active0, long ac
    switch (pos)
    {
       case 0:
-         if ((active0 & 0x4800L) != 0L || (active1 & 0x400000000000L) != 0L || (active2 & 0x4L) != 0L)
+         if ((active0 & 0x4800L) != 0L || (active1 & 0x200000L) != 0L || (active2 & 0x8L) != 0L)
             return 2;
-         if ((active1 & 0x40000000000000L) != 0L)
+         if ((active1 & 0x200L) != 0L)
             return 16;
-         if ((active1 & 0x4000100000000L) != 0L)
+         if ((active1 & 0x20000000000000L) != 0L || (active2 & 0x80L) != 0L)
             return 8;
-         if ((active0 & 0xffffff1ffff00000L) != 0L || (active1 & 0x3ffL) != 0L)
+         if ((active0 & 0xffffff1ffff00000L) != 0L || (active1 & 0x600000ffL) != 0L)
          {
-            jjmatchedKind = 84;
+            jjmatchedKind = 105;
             return 14;
          }
          return -1;
       case 1:
-         if ((active0 & 0xbfffef1fff700000L) != 0L || (active1 & 0x2efL) != 0L)
+         if ((active0 & 0x4000L) != 0L)
+            return 0;
+         if ((active0 & 0xbfffef1fff700000L) != 0L || (active1 & 0x400000efL) != 0L)
          {
             if (jjmatchedPos != 1)
             {
-               jjmatchedKind = 84;
+               jjmatchedKind = 105;
                jjmatchedPos = 1;
             }
             return 14;
          }
-         if ((active0 & 0x4000L) != 0L)
-            return 0;
-         if ((active0 & 0x4000100000800000L) != 0L || (active1 & 0x110L) != 0L)
+         if ((active0 & 0x4000100000800000L) != 0L || (active1 & 0x20000010L) != 0L)
             return 14;
          return -1;
       case 2:
-         if ((active0 & 0x2001400000400000L) != 0L || (active1 & 0x2c0L) != 0L)
+         if ((active0 & 0x2001400000400000L) != 0L || (active1 & 0x400000c0L) != 0L)
             return 14;
          if ((active0 & 0x9ffeaf1fff300000L) != 0L || (active1 & 0x3fL) != 0L)
          {
             if (jjmatchedPos != 2)
             {
-               jjmatchedKind = 84;
+               jjmatchedKind = 105;
                jjmatchedPos = 2;
             }
             return 14;
@@ -346,28 +348,28 @@ private static final int jjStopStringLiteralDfa_1(int pos, long active0, long ac
          {
             if (jjmatchedPos != 3)
             {
-               jjmatchedKind = 84;
+               jjmatchedKind = 105;
                jjmatchedPos = 3;
             }
             return 14;
          }
          return -1;
       case 4:
+         if ((active0 & 0x98802002c100000L) != 0L || (active1 & 0x20L) != 0L)
+            return 14;
          if ((active0 & 0xb6142c1f81200000L) != 0L || (active1 & 0x95L) != 0L)
          {
-            jjmatchedKind = 84;
+            jjmatchedKind = 105;
             jjmatchedPos = 4;
             return 14;
          }
-         if ((active0 & 0x98802002c100000L) != 0L || (active1 & 0x20L) != 0L)
-            return 14;
          return -1;
       case 5:
          if ((active0 & 0x9014001801000000L) != 0L || (active1 & 0x11L) != 0L)
             return 14;
          if ((active0 & 0x26002c0780200000L) != 0L || (active1 & 0x84L) != 0L)
          {
-            jjmatchedKind = 84;
+            jjmatchedKind = 105;
             jjmatchedPos = 5;
             return 14;
          }
@@ -379,7 +381,7 @@ private static final int jjStopStringLiteralDfa_1(int pos, long active0, long ac
          {
             if (jjmatchedPos != 6)
             {
-               jjmatchedKind = 84;
+               jjmatchedKind = 105;
                jjmatchedPos = 6;
             }
             return 14;
@@ -390,25 +392,25 @@ private static final int jjStopStringLiteralDfa_1(int pos, long active0, long ac
             return 14;
          if ((active0 & 0x400000600000000L) != 0L)
          {
-            jjmatchedKind = 84;
+            jjmatchedKind = 105;
             jjmatchedPos = 7;
             return 14;
          }
          return -1;
       case 8:
+         if ((active0 & 0x400000000000000L) != 0L)
+            return 14;
          if ((active0 & 0x600000000L) != 0L)
          {
-            jjmatchedKind = 84;
+            jjmatchedKind = 105;
             jjmatchedPos = 8;
             return 14;
          }
-         if ((active0 & 0x400000000000000L) != 0L)
-            return 14;
          return -1;
       case 9:
          if ((active0 & 0x600000000L) != 0L)
          {
-            jjmatchedKind = 84;
+            jjmatchedKind = 105;
             jjmatchedPos = 9;
             return 14;
          }
@@ -416,7 +418,7 @@ private static final int jjStopStringLiteralDfa_1(int pos, long active0, long ac
       case 10:
          if ((active0 & 0x600000000L) != 0L)
          {
-            jjmatchedKind = 84;
+            jjmatchedKind = 105;
             jjmatchedPos = 10;
             return 14;
          }
@@ -442,68 +444,68 @@ static private final int jjMoveStringLiteralDfa0_1()
    switch(curChar)
    {
       case 33:
-         jjmatchedKind = 119;
-         return jjMoveStringLiteralDfa1_1(0x0L, 0x14000000000L, 0x0L);
+         jjmatchedKind = 74;
+         return jjMoveStringLiteralDfa1_1(0x0L, 0x2800000000000000L, 0x0L);
       case 35:
          return jjStopAtPos(0, 12);
       case 36:
-         return jjStartNfaWithStates_1(0, 118, 16);
+         return jjStartNfaWithStates_1(0, 73, 16);
       case 37:
-         jjmatchedKind = 134;
-         return jjMoveStringLiteralDfa1_1(0x0L, 0x8000000000000L, 0x0L);
+         jjmatchedKind = 89;
+         return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x100L);
       case 38:
-         jjmatchedKind = 131;
-         return jjMoveStringLiteralDfa1_1(0x0L, 0x1000800000000000L, 0x0L);
+         jjmatchedKind = 86;
+         return jjMoveStringLiteralDfa1_1(0x0L, 0x8000L, 0x10L);
       case 40:
-         return jjStopAtPos(0, 88);
+         return jjStopAtPos(0, 109);
       case 41:
-         return jjStopAtPos(0, 89);
+         return jjStopAtPos(0, 110);
       case 42:
-         jjmatchedKind = 129;
-         return jjMoveStringLiteralDfa1_1(0x0L, 0x200000000000L, 0x0L);
+         jjmatchedKind = 84;
+         return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x4L);
       case 43:
-         jjmatchedKind = 127;
-         return jjMoveStringLiteralDfa1_1(0x0L, 0x2000080000000000L, 0x0L);
+         jjmatchedKind = 82;
+         return jjMoveStringLiteralDfa1_1(0x0L, 0x10000L, 0x1L);
       case 44:
-         return jjStopAtPos(0, 95);
+         return jjStopAtPos(0, 116);
       case 45:
-         jjmatchedKind = 128;
-         return jjMoveStringLiteralDfa1_1(0x2000000000L, 0x4000100000000000L, 0x0L);
+         jjmatchedKind = 83;
+         return jjMoveStringLiteralDfa1_1(0x2000000000L, 0x20000L, 0x2L);
       case 46:
-         jjmatchedKind = 96;
-         return jjMoveStringLiteralDfa1_1(0x0L, 0x4000000000000L, 0x0L);
+         jjmatchedKind = 117;
+         return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x80L);
       case 47:
-         jjmatchedKind = 130;
-         return jjMoveStringLiteralDfa1_1(0x4800L, 0x400000000000L, 0x0L);
+         jjmatchedKind = 85;
+         return jjMoveStringLiteralDfa1_1(0x4800L, 0x0L, 0x8L);
       case 58:
-         jjmatchedKind = 122;
+         jjmatchedKind = 77;
          return jjMoveStringLiteralDfa1_1(0x4000000000L, 0x0L, 0x0L);
       case 59:
-         return jjStopAtPos(0, 94);
+         return jjStopAtPos(0, 115);
       case 60:
-         jjmatchedKind = 98;
-         return jjMoveStringLiteralDfa1_1(0x0L, 0x9000000000L, 0x480L);
+         jjmatchedKind = 119;
+         return jjMoveStringLiteralDfa1_1(0x0L, 0x1200000004000000L, 0x400L);
       case 61:
-         jjmatchedKind = 106;
-         return jjMoveStringLiteralDfa1_1(0x8000000000L, 0x20800000000L, 0x0L);
+         jjmatchedKind = 127;
+         return jjMoveStringLiteralDfa1_1(0x8000000000L, 0x4100000000000000L, 0x0L);
       case 62:
-         jjmatchedKind = 97;
-         return jjMoveStringLiteralDfa1_1(0x0L, 0x2000000000L, 0xb00L);
+         jjmatchedKind = 118;
+         return jjMoveStringLiteralDfa1_1(0x0L, 0x400000018000000L, 0x800L);
       case 63:
-         jjmatchedKind = 121;
+         jjmatchedKind = 76;
          return jjMoveStringLiteralDfa1_1(0x10L, 0x0L, 0x0L);
       case 64:
-         return jjStopAtPos(0, 117);
+         return jjStopAtPos(0, 72);
       case 91:
-         return jjStopAtPos(0, 92);
+         return jjStopAtPos(0, 113);
       case 93:
-         return jjStopAtPos(0, 93);
+         return jjStopAtPos(0, 114);
       case 94:
-         jjmatchedKind = 133;
-         return jjMoveStringLiteralDfa1_1(0x0L, 0x2000000000000L, 0x0L);
+         jjmatchedKind = 88;
+         return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x40L);
       case 65:
       case 97:
-         return jjMoveStringLiteralDfa1_1(0x4000000004000000L, 0x200L, 0x0L);
+         return jjMoveStringLiteralDfa1_1(0x4000000004000000L, 0x40000000L, 0x0L);
       case 66:
       case 98:
          return jjMoveStringLiteralDfa1_1(0x8000000L, 0x6L, 0x0L);
@@ -533,7 +535,7 @@ static private final int jjMoveStringLiteralDfa0_1()
          return jjMoveStringLiteralDfa1_1(0x3000000000000L, 0x0L, 0x0L);
       case 79:
       case 111:
-         return jjMoveStringLiteralDfa1_1(0x0L, 0x101L, 0x0L);
+         return jjMoveStringLiteralDfa1_1(0x0L, 0x20000001L, 0x0L);
       case 80:
       case 112:
          return jjMoveStringLiteralDfa1_1(0x20000000L, 0x0L, 0x0L);
@@ -553,15 +555,15 @@ static private final int jjMoveStringLiteralDfa0_1()
       case 119:
          return jjMoveStringLiteralDfa1_1(0x100000000000000L, 0x0L, 0x0L);
       case 123:
-         return jjStopAtPos(0, 90);
+         return jjStopAtPos(0, 111);
       case 124:
-         jjmatchedKind = 132;
-         return jjMoveStringLiteralDfa1_1(0x0L, 0x801000000000000L, 0x0L);
+         jjmatchedKind = 87;
+         return jjMoveStringLiteralDfa1_1(0x0L, 0x4000L, 0x20L);
       case 125:
-         return jjStopAtPos(0, 91);
+         return jjStopAtPos(0, 112);
       case 126:
-         jjmatchedKind = 120;
-         return jjMoveStringLiteralDfa1_1(0x0L, 0x10000000000000L, 0x0L);
+         jjmatchedKind = 75;
+         return jjMoveStringLiteralDfa1_1(0x0L, 0x0L, 0x200L);
       default :
          return jjMoveNfa_1(3, 0);
    }
@@ -576,20 +578,20 @@ static private final int jjMoveStringLiteralDfa1_1(long active0, long active1, l
    switch(curChar)
    {
       case 38:
-         if ((active1 & 0x1000000000000000L) != 0L)
-            return jjStopAtPos(1, 124);
+         if ((active1 & 0x8000L) != 0L)
+            return jjStopAtPos(1, 79);
          break;
       case 42:
          if ((active0 & 0x4000L) != 0L)
             return jjStartNfaWithStates_1(1, 14, 0);
          break;
       case 43:
-         if ((active1 & 0x2000000000000000L) != 0L)
-            return jjStopAtPos(1, 125);
+         if ((active1 & 0x10000L) != 0L)
+            return jjStopAtPos(1, 80);
          break;
       case 45:
-         if ((active1 & 0x4000000000000000L) != 0L)
-            return jjStopAtPos(1, 126);
+         if ((active1 & 0x20000L) != 0L)
+            return jjStopAtPos(1, 81);
          break;
       case 47:
          if ((active0 & 0x800L) != 0L)
@@ -600,48 +602,48 @@ static private final int jjMoveStringLiteralDfa1_1(long active0, long active1, l
             return jjStopAtPos(1, 38);
          break;
       case 60:
-         if ((active2 & 0x80L) != 0L)
+         if ((active1 & 0x4000000L) != 0L)
          {
-            jjmatchedKind = 135;
+            jjmatchedKind = 90;
             jjmatchedPos = 1;
          }
          return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0L, active2, 0x400L);
       case 61:
-         if ((active1 & 0x800000000L) != 0L)
+         if ((active1 & 0x100000000000000L) != 0L)
          {
-            jjmatchedKind = 99;
+            jjmatchedKind = 120;
             jjmatchedPos = 1;
          }
-         else if ((active1 & 0x1000000000L) != 0L)
-            return jjStopAtPos(1, 100);
-         else if ((active1 & 0x2000000000L) != 0L)
-            return jjStopAtPos(1, 101);
-         else if ((active1 & 0x4000000000L) != 0L)
+         else if ((active1 & 0x200000000000000L) != 0L)
+            return jjStopAtPos(1, 121);
+         else if ((active1 & 0x400000000000000L) != 0L)
+            return jjStopAtPos(1, 122);
+         else if ((active1 & 0x800000000000000L) != 0L)
          {
-            jjmatchedKind = 102;
+            jjmatchedKind = 123;
             jjmatchedPos = 1;
          }
-         else if ((active1 & 0x80000000000L) != 0L)
-            return jjStopAtPos(1, 107);
-         else if ((active1 & 0x100000000000L) != 0L)
-            return jjStopAtPos(1, 108);
-         else if ((active1 & 0x200000000000L) != 0L)
-            return jjStopAtPos(1, 109);
-         else if ((active1 & 0x400000000000L) != 0L)
-            return jjStopAtPos(1, 110);
-         else if ((active1 & 0x800000000000L) != 0L)
-            return jjStopAtPos(1, 111);
-         else if ((active1 & 0x1000000000000L) != 0L)
-            return jjStopAtPos(1, 112);
-         else if ((active1 & 0x2000000000000L) != 0L)
-            return jjStopAtPos(1, 113);
-         else if ((active1 & 0x4000000000000L) != 0L)
-            return jjStopAtPos(1, 114);
-         else if ((active1 & 0x8000000000000L) != 0L)
-            return jjStopAtPos(1, 115);
-         else if ((active1 & 0x10000000000000L) != 0L)
-            return jjStopAtPos(1, 116);
-         return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0x30000000000L, active2, 0L);
+         else if ((active2 & 0x1L) != 0L)
+            return jjStopAtPos(1, 128);
+         else if ((active2 & 0x2L) != 0L)
+            return jjStopAtPos(1, 129);
+         else if ((active2 & 0x4L) != 0L)
+            return jjStopAtPos(1, 130);
+         else if ((active2 & 0x8L) != 0L)
+            return jjStopAtPos(1, 131);
+         else if ((active2 & 0x10L) != 0L)
+            return jjStopAtPos(1, 132);
+         else if ((active2 & 0x20L) != 0L)
+            return jjStopAtPos(1, 133);
+         else if ((active2 & 0x40L) != 0L)
+            return jjStopAtPos(1, 134);
+         else if ((active2 & 0x80L) != 0L)
+            return jjStopAtPos(1, 135);
+         else if ((active2 & 0x100L) != 0L)
+            return jjStopAtPos(1, 136);
+         else if ((active2 & 0x200L) != 0L)
+            return jjStopAtPos(1, 137);
+         return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0x6000000000000000L, active2, 0L);
       case 62:
          if ((active0 & 0x10L) != 0L)
             return jjStopAtPos(1, 4);
@@ -649,14 +651,14 @@ static private final int jjMoveStringLiteralDfa1_1(long active0, long active1, l
             return jjStopAtPos(1, 37);
          else if ((active0 & 0x8000000000L) != 0L)
             return jjStopAtPos(1, 39);
-         else if ((active1 & 0x8000000000L) != 0L)
-            return jjStopAtPos(1, 103);
-         else if ((active2 & 0x100L) != 0L)
+         else if ((active1 & 0x8000000L) != 0L)
          {
-            jjmatchedKind = 136;
+            jjmatchedKind = 91;
             jjmatchedPos = 1;
          }
-         return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0L, active2, 0xa00L);
+         else if ((active1 & 0x1000000000000000L) != 0L)
+            return jjStopAtPos(1, 124);
+         return jjMoveStringLiteralDfa2_1(active0, 0L, active1, 0x10000000L, active2, 0x800L);
       case 65:
       case 97:
          return jjMoveStringLiteralDfa2_1(active0, 0x80010000400000L, active1, 0L, active2, 0L);
@@ -685,7 +687,7 @@ static private final int jjMoveStringLiteralDfa1_1(long active0, long active1, l
          return jjMoveStringLiteralDfa2_1(active0, 0x803100000L, active1, 0x20L, active2, 0L);
       case 78:
       case 110:
-         return jjMoveStringLiteralDfa2_1(active0, 0x1e00000280000000L, active1, 0x2c0L, active2, 0L);
+         return jjMoveStringLiteralDfa2_1(active0, 0x1e00000280000000L, active1, 0x400000c0L, active2, 0L);
       case 79:
       case 111:
          if ((active0 & 0x100000000000L) != 0L)
@@ -696,8 +698,8 @@ static private final int jjMoveStringLiteralDfa1_1(long active0, long active1, l
          return jjMoveStringLiteralDfa2_1(active0, 0x2000c60000000000L, active1, 0x16L, active2, 0L);
       case 82:
       case 114:
-         if ((active1 & 0x100L) != 0L)
-            return jjStartNfaWithStates_1(1, 72, 14);
+         if ((active1 & 0x20000000L) != 0L)
+            return jjStartNfaWithStates_1(1, 93, 14);
          return jjMoveStringLiteralDfa2_1(active0, 0x4000002c000000L, active1, 0L, active2, 0L);
       case 83:
       case 115:
@@ -717,8 +719,8 @@ static private final int jjMoveStringLiteralDfa1_1(long active0, long active1, l
       case 120:
          return jjMoveStringLiteralDfa2_1(active0, 0x200000000000L, active1, 0L, active2, 0L);
       case 124:
-         if ((active1 & 0x800000000000000L) != 0L)
-            return jjStopAtPos(1, 123);
+         if ((active1 & 0x4000L) != 0L)
+            return jjStopAtPos(1, 78);
          break;
       default :
          break;
@@ -737,18 +739,18 @@ static private final int jjMoveStringLiteralDfa2_1(long old0, long active0, long
    switch(curChar)
    {
       case 61:
-         if ((active1 & 0x10000000000L) != 0L)
-            return jjStopAtPos(2, 104);
-         else if ((active1 & 0x20000000000L) != 0L)
-            return jjStopAtPos(2, 105);
+         if ((active1 & 0x2000000000000000L) != 0L)
+            return jjStopAtPos(2, 125);
+         else if ((active1 & 0x4000000000000000L) != 0L)
+            return jjStopAtPos(2, 126);
          else if ((active2 & 0x400L) != 0L)
             return jjStopAtPos(2, 138);
          else if ((active2 & 0x800L) != 0L)
             return jjStopAtPos(2, 139);
          break;
       case 62:
-         if ((active2 & 0x200L) != 0L)
-            return jjStopAtPos(2, 137);
+         if ((active1 & 0x10000000L) != 0L)
+            return jjStopAtPos(2, 92);
          break;
       case 65:
       case 97:
@@ -758,8 +760,8 @@ static private final int jjMoveStringLiteralDfa2_1(long old0, long active0, long
          return jjMoveStringLiteralDfa3_1(active0, 0x280000000L, active1, 0L, active2, 0L);
       case 68:
       case 100:
-         if ((active1 & 0x200L) != 0L)
-            return jjStartNfaWithStates_1(2, 73, 14);
+         if ((active1 & 0x40000000L) != 0L)
+            return jjStartNfaWithStates_1(2, 94, 14);
          return jjMoveStringLiteralDfa3_1(active0, 0x1e00000000000000L, active1, 0L, active2, 0L);
       case 69:
       case 101:
@@ -1281,14 +1283,14 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 2;
                   if ((0x3fe000000000000L & l) != 0L)
                   {
-                     if (kind > 74)
-                        kind = 74;
+                     if (kind > 95)
+                        kind = 95;
                      jjCheckNAddTwoStates(5, 6);
                   }
                   else if (curChar == 48)
                   {
-                     if (kind > 74)
-                        kind = 74;
+                     if (kind > 95)
+                        kind = 95;
                      jjCheckNAddStates(21, 23);
                   }
                   break;
@@ -1307,15 +1309,15 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                case 4:
                   if ((0x3fe000000000000L & l) == 0L)
                      break;
-                  if (kind > 74)
-                     kind = 74;
+                  if (kind > 95)
+                     kind = 95;
                   jjCheckNAddTwoStates(5, 6);
                   break;
                case 5:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 74)
-                     kind = 74;
+                  if (kind > 95)
+                     kind = 95;
                   jjCheckNAddTwoStates(5, 6);
                   break;
                case 7:
@@ -1325,8 +1327,8 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                case 8:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 78)
-                     kind = 78;
+                  if (kind > 99)
+                     kind = 99;
                   jjCheckNAddStates(24, 26);
                   break;
                case 10:
@@ -1336,15 +1338,15 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                case 11:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 78)
-                     kind = 78;
+                  if (kind > 99)
+                     kind = 99;
                   jjCheckNAddTwoStates(11, 12);
                   break;
                case 14:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 84)
-                     kind = 84;
+                  if (kind > 105)
+                     kind = 105;
                   jjstateSet[jjnewStateCnt++] = 14;
                   break;
                case 15:
@@ -1369,15 +1371,15 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                case 20:
                   if (curChar != 46)
                      break;
-                  if (kind > 78)
-                     kind = 78;
+                  if (kind > 99)
+                     kind = 99;
                   jjCheckNAddStates(27, 29);
                   break;
                case 21:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 78)
-                     kind = 78;
+                  if (kind > 99)
+                     kind = 99;
                   jjCheckNAddStates(27, 29);
                   break;
                case 23:
@@ -1387,8 +1389,8 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                case 24:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 78)
-                     kind = 78;
+                  if (kind > 99)
+                     kind = 99;
                   jjCheckNAddTwoStates(24, 12);
                   break;
                case 25:
@@ -1402,8 +1404,8 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                case 28:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 78)
-                     kind = 78;
+                  if (kind > 99)
+                     kind = 99;
                   jjCheckNAddTwoStates(28, 12);
                   break;
                case 29:
@@ -1421,22 +1423,22 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                case 33:
                   if (curChar != 48)
                      break;
-                  if (kind > 74)
-                     kind = 74;
+                  if (kind > 95)
+                     kind = 95;
                   jjCheckNAddStates(21, 23);
                   break;
                case 35:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 74)
-                     kind = 74;
+                  if (kind > 95)
+                     kind = 95;
                   jjCheckNAddTwoStates(35, 6);
                   break;
                case 36:
                   if ((0xff000000000000L & l) == 0L)
                      break;
-                  if (kind > 74)
-                     kind = 74;
+                  if (kind > 95)
+                     kind = 95;
                   jjCheckNAddTwoStates(36, 6);
                   break;
                case 37:
@@ -1456,8 +1458,8 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 43;
                   break;
                case 44:
-                  if (curChar == 34 && kind > 80)
-                     kind = 80;
+                  if (curChar == 34 && kind > 101)
+                     kind = 101;
                   break;
                case 45:
                   if ((0xfffffffbffffffffL & l) != 0L)
@@ -1472,8 +1474,8 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 50;
                   break;
                case 51:
-                  if (curChar == 34 && kind > 81)
-                     kind = 81;
+                  if (curChar == 34 && kind > 102)
+                     kind = 102;
                   break;
                case 52:
                   if (curChar == 39)
@@ -1488,8 +1490,8 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                      jjCheckNAddStates(41, 43);
                   break;
                case 56:
-                  if (curChar == 39 && kind > 80)
-                     kind = 80;
+                  if (curChar == 39 && kind > 101)
+                     kind = 101;
                   break;
                case 57:
                   if ((0xffffff7fffffffffL & l) != 0L)
@@ -1500,8 +1502,8 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                      jjCheckNAddStates(44, 46);
                   break;
                case 60:
-                  if (curChar == 39 && kind > 82)
-                     kind = 82;
+                  if (curChar == 39 && kind > 103)
+                     kind = 103;
                   break;
                case 62:
                   jjAddStates(47, 49);
@@ -1523,8 +1525,8 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                case 3:
                   if ((0x87fffffe87fffffeL & l) != 0L)
                   {
-                     if (kind > 84)
-                        kind = 84;
+                     if (kind > 105)
+                        kind = 105;
                      jjCheckNAdd(14);
                   }
                   else if (curChar == 96)
@@ -1535,23 +1537,23 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                      kind = 13;
                   break;
                case 6:
-                  if ((0x100000001000L & l) != 0L && kind > 74)
-                     kind = 74;
+                  if ((0x100000001000L & l) != 0L && kind > 95)
+                     kind = 95;
                   break;
                case 9:
                   if ((0x2000000020L & l) != 0L)
                      jjAddStates(59, 60);
                   break;
                case 12:
-                  if ((0x5000000050L & l) != 0L && kind > 78)
-                     kind = 78;
+                  if ((0x5000000050L & l) != 0L && kind > 99)
+                     kind = 99;
                   break;
                case 13:
                case 14:
                   if ((0x87fffffe87fffffeL & l) == 0L)
                      break;
-                  if (kind > 84)
-                     kind = 84;
+                  if (kind > 105)
+                     kind = 105;
                   jjCheckNAdd(14);
                   break;
                case 16:
@@ -1581,8 +1583,8 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                case 35:
                   if ((0x7e0000007eL & l) == 0L)
                      break;
-                  if (kind > 74)
-                     kind = 74;
+                  if (kind > 95)
+                     kind = 95;
                   jjCheckNAddTwoStates(35, 6);
                   break;
                case 38:
@@ -1654,8 +1656,8 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 63;
                   break;
                case 65:
-                  if (curChar == 96 && kind > 80)
-                     kind = 80;
+                  if (curChar == 96 && kind > 101)
+                     kind = 101;
                   break;
                case 66:
                   if ((0xfffffffeffffffffL & l) != 0L)
@@ -1670,8 +1672,8 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                      jjstateSet[jjnewStateCnt++] = 67;
                   break;
                case 69:
-                  if (curChar == 96 && kind > 83)
-                     kind = 83;
+                  if (curChar == 96 && kind > 104)
+                     kind = 104;
                   break;
                default : break;
             }
@@ -1689,8 +1691,8 @@ static private final int jjMoveNfa_1(int startState, int curPos)
                case 14:
                   if ((jjbitVec0[i2] & l2) == 0L)
                      break;
-                  if (kind > 84)
-                     kind = 84;
+                  if (kind > 105)
+                     kind = 105;
                   jjCheckNAdd(14);
                   break;
                case 1:
@@ -1794,13 +1796,13 @@ null, null, null, null, null, null, null, null, null, null, null, null, null, nu
 null, null, null, null, null, null, null, null, null, null, null, null, "\55\76", 
 "\72\72", "\75\76", null, null, null, null, null, null, null, null, null, null, null, 
 null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
-null, null, null, null, null, null, null, null, null, "\50", "\51", "\173", "\175", 
-"\133", "\135", "\73", "\54", "\56", "\76", "\74", "\75\75", "\74\75", "\76\75", 
-"\41\75", "\74\76", "\41\75\75", "\75\75\75", "\75", "\53\75", "\55\75", "\52\75", 
-"\57\75", "\46\75", "\174\75", "\136\75", "\56\75", "\45\75", "\176\75", "\100", "\44", 
-"\41", "\176", "\77", "\72", "\174\174", "\46\46", "\53\53", "\55\55", "\53", "\55", 
-"\52", "\57", "\46", "\174", "\136", "\45", "\74\74", "\76\76", "\76\76\76", 
+null, null, null, null, null, null, null, "\100", "\44", "\41", "\176", "\77", 
+"\72", "\174\174", "\46\46", "\53\53", "\55\55", "\53", "\55", "\52", "\57", "\46", 
+"\174", "\136", "\45", "\74\74", "\76\76", "\76\76\76", null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, "\50", "\51", 
+"\173", "\175", "\133", "\135", "\73", "\54", "\56", "\76", "\74", "\75\75", "\74\75", 
+"\76\75", "\41\75", "\74\76", "\41\75\75", "\75\75\75", "\75", "\53\75", "\55\75", 
+"\52\75", "\57\75", "\46\75", "\174\75", "\136\75", "\56\75", "\45\75", "\176\75", 
 "\74\74\75", "\76\76\75", null, };
 public static final String[] lexStateNames = {
    "DEFAULT", 
@@ -1818,7 +1820,7 @@ public static final int[] jjnewLexState = {
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
 };
 static final long[] jjtoToken = {
-   0xfffffffffff0001fL, 0xffffffffff1f47ffL, 0x1fffL, 
+   0xfffffffffff0001fL, 0xffffe3e8ffffffffL, 0x1fffL, 
 };
 static final long[] jjtoSkip = {
    0x7ffe0L, 0x0L, 0x0L, 
@@ -1977,6 +1979,7 @@ public static Token getNextToken()
         {
            matchedToken = jjFillToken();
            matchedToken.specialToken = specialToken;
+           TokenLexicalActions(matchedToken);
        if (jjnewLexState[jjmatchedKind] != -1)
          curLexState = jjnewLexState[jjmatchedKind];
            return matchedToken;
@@ -2051,4 +2054,40 @@ static void SkipLexicalActions(Token matchedToken)
          break;
    }
 }
+static void TokenLexicalActions(Token matchedToken)
+{
+   switch(jjmatchedKind)
+   {
+      case 1 :
+        if (image == null)
+            image = new StringBuffer(jjstrLiteralImages[1]);
+         else
+            image.append(jjstrLiteralImages[1]);
+                             PHPParser.createNewHTMLCode();
+         break;
+      case 2 :
+        if (image == null)
+            image = new StringBuffer(new String(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))));
+         else
+            image.append(new String(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))));
+                             PHPParser.createNewHTMLCode();
+         break;
+      case 3 :
+        if (image == null)
+            image = new StringBuffer(jjstrLiteralImages[3]);
+         else
+            image.append(jjstrLiteralImages[3]);
+                             PHPParser.createNewHTMLCode();
+         break;
+      case 4 :
+        if (image == null)
+            image = new StringBuffer(jjstrLiteralImages[4]);
+         else
+            image.append(jjstrLiteralImages[4]);
+                  PHPParser.htmlStart = SimpleCharStream.getPosition();
+         break;
+      default : 
+         break;
+   }
+}
 }
index 1187798..011f1f2 100644 (file)
@@ -27,6 +27,7 @@ public class SimpleCharStream
   static protected boolean prevCharIsLF = false;
 
   static protected java.io.Reader inputStream;
+  static protected StringBuffer currentBuffer = new StringBuffer();
 
   static protected char[] buffer;
   static protected int maxNextCharInd = 0;
@@ -119,6 +120,7 @@ public class SimpleCharStream
         else {
            maxNextCharInd += i;
         }
+        currentBuffer.append(buffer);
         return;
      }
      catch(java.io.IOException e) {
@@ -252,6 +254,7 @@ public class SimpleCharStream
        "       either use ReInit() or set the JavaCC option STATIC to false\n" +
        "       during the generation of this class.");
     inputStream = dstream;
+    currentBuffer = new StringBuffer();
     line = startline;
     column = startcolumn - 1;
 
@@ -275,6 +278,7 @@ public class SimpleCharStream
   int startcolumn, int buffersize)
   {
     inputStream = dstream;
+    currentBuffer = new StringBuffer();
     line = startline;
     column = startcolumn - 1;