when you check php or html you have now to tell if the parser should throw an excepti...
[phpeclipse.git] / net.sourceforge.phpeclipse / src / test / PHPParser.jj
index 530693d..2c1b336 100644 (file)
@@ -3,7 +3,7 @@ options {
   CHOICE_AMBIGUITY_CHECK = 2;
   OTHER_AMBIGUITY_CHECK = 1;
   STATIC = true;
-  DEBUG_PARSER = false;
+  DEBUG_PARSER = true;
   DEBUG_LOOKAHEAD = false;
   DEBUG_TOKEN_MANAGER = false;
   OPTIMIZE_TOKEN_MANAGER = false;
@@ -40,7 +40,7 @@ import net.sourceforge.phpdt.internal.compiler.ast.*;
 import net.sourceforge.phpdt.internal.compiler.parser.OutlineableWithChildren;
 import net.sourceforge.phpdt.internal.compiler.parser.Outlineable;
 import net.sourceforge.phpdt.internal.compiler.parser.PHPOutlineInfo;
-import junit.framework.Assert;
+import net.sourceforge.phpdt.internal.corext.Assert;
 
 /**
  * A new php parser.
@@ -81,7 +81,7 @@ public final class PHPParser extends PHPParserSuperclass {
   /** The cursor in expression stack. */
   private static int nodePtr;
 
-  private static final boolean PARSER_DEBUG = false;
+  private static final boolean PARSER_DEBUG = true;
 
   public final void setFileToParse(final IFile fileToParse) {
     PHPParser.fileToParse = fileToParse;
@@ -95,6 +95,46 @@ public final class PHPParser extends PHPParserSuperclass {
     PHPParser.fileToParse = fileToParse;
   }
 
+  public static final void phpParserTester(final String strEval) throws ParseException {
+    final StringReader stream = new StringReader(strEval);
+    if (jj_input_stream == null) {
+      jj_input_stream = new SimpleCharStream(stream, 1, 1);
+    }
+    ReInit(new StringReader(strEval));
+    init();
+    phpDocument = new PHPDocument(null,"_root".toCharArray());
+    currentSegment = phpDocument;
+    outlineInfo = new PHPOutlineInfo(null, currentSegment);
+    PHPParserTokenManager.SwitchTo(PHPParserTokenManager.PHPPARSING);
+    phpTest();
+  }
+
+  public static final void htmlParserTester(final File fileName) throws FileNotFoundException, ParseException {
+    final Reader stream = new FileReader(fileName);
+    if (jj_input_stream == null) {
+      jj_input_stream = new SimpleCharStream(stream, 1, 1);
+    }
+    ReInit(stream);
+    init();
+    phpDocument = new PHPDocument(null,"_root".toCharArray());
+    currentSegment = phpDocument;
+    outlineInfo = new PHPOutlineInfo(null, currentSegment);
+    phpFile();
+  }
+
+  public static final void htmlParserTester(final String strEval) throws ParseException {
+    final StringReader stream = new StringReader(strEval);
+    if (jj_input_stream == null) {
+      jj_input_stream = new SimpleCharStream(stream, 1, 1);
+    }
+    ReInit(stream);
+    init();
+    phpDocument = new PHPDocument(null,"_root".toCharArray());
+    currentSegment = phpDocument;
+    outlineInfo = new PHPOutlineInfo(null, currentSegment);
+    phpFile();
+  }
+
   /**
    * Reinitialize the parser.
    */
@@ -144,16 +184,18 @@ public final class PHPParser extends PHPParserSuperclass {
     return outlineInfo;
   }
 
+  private static void processParseExceptionDebug(final ParseException e) throws ParseException {
+    if (PARSER_DEBUG) {
+      throw e;
+    }
+    processParseException(e);
+  }
   /**
    * This method will process the parse exception.
    * If the error message is null, the parse exception wasn't catched and a trace is written in the log
    * @param e the ParseException
    */
   private static void processParseException(final ParseException e) {
-    if (PARSER_DEBUG) {
-      e.printStackTrace();
-      Assert.assertTrue(false);
-    }
     if (errorMessage == null) {
       PHPeclipsePlugin.log(e);
       errorMessage = "this exception wasn't handled by the parser please tell us how to reproduce it";
@@ -581,6 +623,13 @@ MORE :
   <DOLLAR_ID: <DOLLAR> <IDENTIFIER>>
 }
 
+void phpTest() :
+{}
+{
+  Php()
+  <EOF>
+}
+
 void phpFile() :
 {}
 {
@@ -632,7 +681,7 @@ void PhpBlock() :
     errorLevel   = ERROR;
     errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd   = SimpleCharStream.getPosition() + 1;
-    processParseException(e);
+    processParseExceptionDebug(e);
   }
 }
 
@@ -675,7 +724,7 @@ ClassDeclaration ClassDeclaration() :
     errorLevel   = ERROR;
     errorStart   = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd     = SimpleCharStream.getPosition() + 1;
-    processParseException(e);
+    processParseExceptionDebug(e);
   }
   [
     <EXTENDS>
@@ -687,7 +736,7 @@ ClassDeclaration ClassDeclaration() :
       errorLevel   = ERROR;
       errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
       errorEnd   = SimpleCharStream.getPosition() + 1;
-      processParseException(e);
+      processParseExceptionDebug(e);
       superclassNameImage = SYNTAX_ERROR_CHAR;
     }
   ]
@@ -709,7 +758,7 @@ ClassDeclaration ClassDeclaration() :
   }
   ClassBody(classDeclaration)
   {currentSegment = (OutlineableWithChildren) currentSegment.getParent();
-   classDeclaration.sourceEnd = SimpleCharStream.getPosition();
+   classDeclaration.setSourceEnd(SimpleCharStream.getPosition());
    pushOnAstNodes(classDeclaration);
    return classDeclaration;}
 }
@@ -724,7 +773,7 @@ void ClassBody(final ClassDeclaration classDeclaration) :
     errorLevel   = ERROR;
     errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd   = SimpleCharStream.getPosition() + 1;
-    processParseException(e);
+    processParseExceptionDebug(e);
   }
   ( ClassBodyDeclaration(classDeclaration) )*
   try {
@@ -734,7 +783,7 @@ void ClassBody(final ClassDeclaration classDeclaration) :
     errorLevel   = ERROR;
     errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd   = SimpleCharStream.getPosition() + 1;
-    processParseException(e);
+    processParseExceptionDebug(e);
   }
 }
 
@@ -779,7 +828,7 @@ FieldDeclaration FieldDeclaration() :
     errorLevel   = ERROR;
     errorStart   = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd     = SimpleCharStream.getPosition() + 1;
-    processParseException(e);
+    processParseExceptionDebug(e);
   }
 
   {list = new VariableDeclaration[arrayList.size()];
@@ -798,10 +847,10 @@ VariableDeclaration VariableDeclaratorNoSuffix() :
 {
   final Token varName;
   Expression initializer = null;
-  final int pos = SimpleCharStream.getPosition();
 }
 {
   varName = <DOLLAR_ID>
+  {final int pos = SimpleCharStream.getPosition()-varName.image.length();}
   [
     <ASSIGN>
     try {
@@ -811,18 +860,18 @@ VariableDeclaration VariableDeclaratorNoSuffix() :
       errorLevel   = ERROR;
       errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
       errorEnd   = SimpleCharStream.getPosition() + 1;
-      processParseException(e);
+      processParseExceptionDebug(e);
     }
   ]
   {
   if (initializer == null) {
     return new VariableDeclaration(currentSegment,
-                                   new Variable(varName.image.substring(1).toCharArray(),SimpleCharStream.getPosition()-varName.image.length()-1,SimpleCharStream.getPosition()),
+                                   new Variable(varName.image.substring(1),SimpleCharStream.getPosition()-varName.image.length()-1,SimpleCharStream.getPosition()),
                                    pos,
                                    SimpleCharStream.getPosition());
   }
   return new VariableDeclaration(currentSegment,
-                                   new Variable(varName.image.substring(1).toCharArray(),SimpleCharStream.getPosition()-varName.image.length()-1,SimpleCharStream.getPosition()),
+                                 new Variable(varName.image.substring(1),SimpleCharStream.getPosition()-varName.image.length()-1,SimpleCharStream.getPosition()),
                                  initializer,
                                  VariableDeclaration.EQUAL,
                                  pos);
@@ -834,12 +883,12 @@ VariableDeclaration VariableDeclaratorNoSuffix() :
  */
 VariableDeclaration VariableDeclarator() :
 {
-  final String varName;
+  final AbstractVariable variable;
   Expression initializer = null;
   final int pos = SimpleCharStream.getPosition();
 }
 {
-  varName = VariableDeclaratorId()
+  variable = VariableDeclaratorId()
   [
     <ASSIGN>
     try {
@@ -849,18 +898,18 @@ VariableDeclaration VariableDeclarator() :
       errorLevel   = ERROR;
       errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
       errorEnd   = SimpleCharStream.getPosition() + 1;
-      processParseException(e);
+      processParseExceptionDebug(e);
     }
   ]
   {
   if (initializer == null) {
     return new VariableDeclaration(currentSegment,
-                                   new Variable(varName.substring(1).toCharArray(),SimpleCharStream.getPosition()-varName.length()-1,SimpleCharStream.getPosition()),
-                                  pos,
-                                  SimpleCharStream.getPosition());
+                                   variable,
+                                   pos,
+                                   SimpleCharStream.getPosition());
   }
     return new VariableDeclaration(currentSegment,
-                                   new Variable(varName.substring(1).toCharArray(),SimpleCharStream.getPosition()-varName.length()-1,SimpleCharStream.getPosition()),
+                                   variable,
                                    initializer,
                                    VariableDeclaration.EQUAL,
                                    pos);
@@ -871,28 +920,24 @@ VariableDeclaration VariableDeclarator() :
  * A Variable name.
  * @return the variable name (with suffix)
  */
-String VariableDeclaratorId() :
+AbstractVariable VariableDeclaratorId() :
 {
-  final String var;
-  Expression expression = null;
+  final Variable var;
+  AbstractVariable expression = null;
   final int pos = SimpleCharStream.getPosition();
-  ConstantIdentifier ex;
 }
 {
   try {
     var = Variable()
     (
       LOOKAHEAD(2)
-      {ex = new ConstantIdentifier(var.toCharArray(),
-                                   pos,
-                                   SimpleCharStream.getPosition());}
-      expression = VariableSuffix(ex)
+      expression = VariableSuffix(var)
     )*
     {
      if (expression == null) {
        return var;
      }
-     return expression.toStringExpression();
+     return expression;
     }
   } catch (ParseException e) {
     errorMessage = "'$' expected for variable identifier";
@@ -907,68 +952,102 @@ String VariableDeclaratorId() :
  * Return a variablename without the $.
  * @return a variable name
  */
-String Variable():
+Variable Variable():
 {
   final StringBuffer buff;
   Expression expression = null;
   final Token token;
-  final String expr;
+  Variable expr;
+  final int pos;
 }
 {
-  token = <DOLLAR_ID> [<LBRACE> expression = Expression() <RBRACE>]
+  token = <DOLLAR_ID> {pos = SimpleCharStream.getPosition()-token.image.length();}
+  [<LBRACE> expression = Expression() <RBRACE>]
   {
     if (expression == null) {
-      return token.image.substring(1);
+      return new Variable(token.image.substring(1),pos,SimpleCharStream.getPosition());
     }
-    buff = new StringBuffer(token.image);
+    String s = expression.toStringExpression();
+    buff = new StringBuffer(token.image.length()+s.length()+2);
+    buff.append(token.image);
     buff.append("{");
-    buff.append(expression.toStringExpression());
+    buff.append(s);
     buff.append("}");
-    return buff.toString();
+    s = buff.toString();
+    return new Variable(s,pos,SimpleCharStream.getPosition());
   }
 |
-  <DOLLAR> expr = VariableName()
-  {return expr;}
+  <DOLLAR> {pos = SimpleCharStream.getPosition()-1;}
+  expr = VariableName()
+  {return new Variable(expr,pos,SimpleCharStream.getPosition());}
 }
 
 /**
  * A Variable name (without the $)
  * @return a variable name String
  */
-String VariableName():
+Variable VariableName():
 {
   final StringBuffer buff;
-  final String expr;
+  String expr;
+  final Variable var;
   Expression expression = null;
   final Token token;
+  int pos;
 }
 {
-  <LBRACE> expression = Expression() <RBRACE>
-  {buff = new StringBuffer("{");
-   buff.append(expression.toStringExpression());
+  <LBRACE>
+  {pos = SimpleCharStream.getPosition()-1;}
+  expression = Expression() <RBRACE>
+  {expr = expression.toStringExpression();
+   buff = new StringBuffer(expr.length()+2);
+   buff.append("{");
+   buff.append(expr);
    buff.append("}");
-   return buff.toString();}
+   pos = SimpleCharStream.getPosition();
+   expr = buff.toString();
+   return new Variable(expr,
+                       pos,
+                       SimpleCharStream.getPosition());
+
+   }
 |
-  token = <IDENTIFIER> [<LBRACE> expression = Expression() <RBRACE>]
+  token = <IDENTIFIER>
+  {pos = SimpleCharStream.getPosition() - token.image.length();}
+  [<LBRACE> expression = Expression() <RBRACE>]
   {
     if (expression == null) {
-      return token.image;
+      return new Variable(token.image,
+                          pos,
+                          SimpleCharStream.getPosition());
     }
-    buff = new StringBuffer(token.image);
+    expr = expression.toStringExpression();
+    buff = new StringBuffer(token.image.length()+expr.length()+2);
+    buff.append(token.image);
     buff.append("{");
-    buff.append(expression.toStringExpression());
+    buff.append(expr);
     buff.append("}");
-    return buff.toString();
+    expr = buff.toString();
+    return new Variable(expr,
+                        pos,
+                        SimpleCharStream.getPosition());
   }
 |
-  <DOLLAR> expr = VariableName()
+  <DOLLAR> {pos = SimpleCharStream.getPosition() - 1;}
+  var = VariableName()
   {
-    buff = new StringBuffer("$");
-    buff.append(expr);
-    return buff.toString();
+    return new Variable(var,
+                        pos,
+                        SimpleCharStream.getPosition());
   }
 |
-  token = <DOLLAR_ID> {return token.image;}
+  token = <DOLLAR_ID>
+  {
+  pos = SimpleCharStream.getPosition();
+  return new Variable(token.image,
+                      pos-token.image.length(),
+                      pos);
+  }
 }
 
 Expression VariableInitializer() :
@@ -1092,7 +1171,7 @@ MethodDeclaration MethodDeclarator() :
     errorLevel   = ERROR;
     errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd   = SimpleCharStream.getPosition() + 1;
-    processParseException(e);
+    processParseExceptionDebug(e);
   }
   formalParameters = FormalParameters()
   {MethodDeclaration method =  new MethodDeclaration(currentSegment,
@@ -1121,7 +1200,7 @@ Hashtable FormalParameters() :
     errorLevel   = ERROR;
     errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd   = SimpleCharStream.getPosition() + 1;
-    processParseException(e);
+    processParseExceptionDebug(e);
   }
   [
     var = FormalParameter()
@@ -1138,7 +1217,7 @@ Hashtable FormalParameters() :
     errorLevel   = ERROR;
     errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd   = SimpleCharStream.getPosition() + 1;
-    processParseException(e);
+    processParseExceptionDebug(e);
   }
  {return parameters;}
 }
@@ -1209,21 +1288,21 @@ Expression Expression() :
     }
   ]
   {
-    char[] varName = expr.toStringExpression().substring(1).toCharArray();
-    if (assignOperator == -1) {
+    if (assignOperator != -1) {// todo : change this, very very bad :(
+        if (expr instanceof AbstractVariable) {
+          return new VariableDeclaration(currentSegment,
+                                         (AbstractVariable) expr,
+                                         pos,
+                                         SimpleCharStream.getPosition());
+        }
+        String varName = expr.toStringExpression().substring(1);
         return new VariableDeclaration(currentSegment,
-                                       new Variable(varName,SimpleCharStream.getPosition()-varName.length-1,SimpleCharStream.getPosition()),
+                                       new Variable(varName,SimpleCharStream.getPosition()-varName.length()-1,SimpleCharStream.getPosition()),
                                        pos,
                                        SimpleCharStream.getPosition());
-      return expr;
-    }
-    return new VariableDeclaration(currentSegment,
-                                   new Variable(varName,SimpleCharStream.getPosition()-varName.length-1,SimpleCharStream.getPosition()),
-                                   initializer,
-                                   assignOperator,
-                                   pos);
     }
-  {return expr;}
+    return expr;
+  }
 | expr = ExpressionWBang()       {return expr;}
 }
 
@@ -1242,8 +1321,9 @@ Expression ExpressionNoBang() :
   Expression expr;
 }
 {
+  expr = ListExpression()    {return expr;}
+|
   expr = PrintExpression()   {return expr;}
-| expr = ListExpression()    {return expr;}
 }
 
 /**
@@ -1447,9 +1527,10 @@ Expression AdditiveExpression() :
 {
   expr = MultiplicativeExpression()
   (
-  LOOKAHEAD(1)
-   ( <PLUS>  {operator = OperatorIds.PLUS;}
-   | <MINUS> {operator = OperatorIds.MINUS;} )
+    LOOKAHEAD(1)
+     ( <PLUS>  {operator = OperatorIds.PLUS;}
+     | <MINUS> {operator = OperatorIds.MINUS;}
+  )
    expr2 = MultiplicativeExpression()
   {expr = new BinaryExpression(expr,expr2,operator);}
    )*
@@ -1491,9 +1572,9 @@ Expression UnaryExpression() :
   final int pos = SimpleCharStream.getPosition();
 }
 {
-  <BIT_AND> expr = UnaryExpressionNoPrefix()
+ /* <BIT_AND> expr = UnaryExpressionNoPrefix()             //why did I had that ?
   {return new PrefixedUnaryExpression(expr,OperatorIds.AND,pos);}
-|
+|      */
   expr = AtNotUnaryExpression() {return expr;}
 }
 
@@ -1523,26 +1604,18 @@ Expression AtNotUnaryExpression() :
 Expression UnaryExpressionNoPrefix() :
 {
   final Expression expr;
-  final int operator;
   final int pos = SimpleCharStream.getPosition();
 }
 {
-  (
-      <PLUS>  {operator = OperatorIds.PLUS;}
-    |
-      <MINUS> {operator = OperatorIds.MINUS;}
-  )
-  expr = UnaryExpression()
-  {return new PrefixedUnaryExpression(expr,operator,pos);}
+  <PLUS> expr = AtNotUnaryExpression()   {return new PrefixedUnaryExpression(expr,OperatorIds.PLUS,pos);}
+|
+  <MINUS> expr = AtNotUnaryExpression()  {return new PrefixedUnaryExpression(expr,OperatorIds.MINUS,pos);}
 |
   expr = PreIncDecExpression()
   {return expr;}
 |
   expr = UnaryExpressionNotPlusMinus()
   {return expr;}
-/*|
-  LOOKAHEAD(2)
-  expr = PrintExpression()   {return expr;}*/
 }
 
 
@@ -1625,22 +1698,40 @@ Expression PostfixExpression() :
 
 Expression PrimaryExpression() :
 {
-  Expression expr;
+  Expression expr = null;
+  Expression expr2;
   int assignOperator = -1;
   final Token identifier;
   final String var;
-  final int pos = SimpleCharStream.getPosition();
+  final int pos;
 }
 {
-  expr = PrimaryPrefix()
-  (expr = PrimarySuffix(expr))*
+  token = <IDENTIFIER>
+  {
+    pos = SimpleCharStream.getPosition();
+    expr = new ConstantIdentifier(token.image.toCharArray(),
+                                  pos-token.image.length(),
+                                  pos);
+  }
+  (
+    <STATICCLASSACCESS> expr2 = ClassIdentifier()
+    {expr = new ClassAccess(expr,
+                            expr2,
+                            ClassAccess.STATIC);}
+  )*
   [ expr = Arguments(expr) ]
   {return expr;}
 |
-  <NEW> expr = ClassIdentifier()
+  expr = VariableDeclaratorId()
+  [ expr = Arguments(expr) ]
+  {return expr;}
+|
+  <NEW>
+  {pos = SimpleCharStream.getPosition();}
+  expr = ClassIdentifier()
   {expr = new PrefixedUnaryExpression(expr,
                                       OperatorIds.NEW,
-                                      pos);
+                                      pos-3);
   }
   [ expr = Arguments(expr) ]
   {return expr;}
@@ -1649,37 +1740,6 @@ Expression PrimaryExpression() :
   {return expr;}
 }
 
-Expression PrimaryPrefix() :
-{
-  final Expression expr;
-  final Token token;
-  final String var;
-  final int pos = SimpleCharStream.getPosition();
-}
-{
-  token = <IDENTIFIER>           {return new ConstantIdentifier(token.image.toCharArray(),
-                                                                pos,
-                                                                SimpleCharStream.getPosition());}
-|
-  var = VariableDeclaratorId()   {return new Variable(var.toCharArray(),
-                                                      pos,
-                                                      SimpleCharStream.getPosition());}
-}
-
-AbstractSuffixExpression PrimarySuffix(final Expression prefix) :
-{
-  final AbstractSuffixExpression suffix;
-  final Expression expr;
-}
-{
-  suffix = VariableSuffix(prefix) {return suffix;}
-| <STATICCLASSACCESS> expr = ClassIdentifier()
-  {suffix = new ClassAccess(prefix,
-                            expr,
-                            ClassAccess.STATIC);
-   return suffix;}
-}
-
 /**
  * An array declarator.
  * array(vars)
@@ -1716,26 +1776,28 @@ PrefixedUnaryExpression classInstantiation() :
                                       pos);}
 }
 
-ConstantIdentifier ClassIdentifier():
+Expression ClassIdentifier():
 {
-  final String expr;
+  final Expression expr;
   final Token token;
-  final int pos = SimpleCharStream.getPosition();
   final ConstantIdentifier type;
 }
 {
-  token = <IDENTIFIER>          {return new ConstantIdentifier(token.image.toCharArray(),
-                                                               pos,
-                                                               SimpleCharStream.getPosition());}
-| type = Type()          {return type;}
-| expr = VariableDeclaratorId() {return new ConstantIdentifier(expr.toCharArray(),
-                                                               pos,
-                                                               SimpleCharStream.getPosition());}
+  token = <IDENTIFIER>
+  {final int pos = SimpleCharStream.getPosition();
+   return new ConstantIdentifier(token.image.toCharArray(),
+                                 pos-token.image.length(),
+                                 pos);}
+| expr = Type()                 {return expr;}
+| expr = VariableDeclaratorId() {return expr;}
 }
 
-AbstractSuffixExpression VariableSuffix(final Expression prefix) :
+/**
+ * Used by Variabledeclaratorid and primarysuffix
+ */
+AbstractVariable VariableSuffix(final AbstractVariable prefix) :
 {
-  String expr = null;
+  Variable expr = null;
   final int pos = SimpleCharStream.getPosition();
   Expression expression = null;
 }
@@ -1751,7 +1813,7 @@ AbstractSuffixExpression VariableSuffix(final Expression prefix) :
     throw e;
   }
   {return new ClassAccess(prefix,
-                          new ConstantIdentifier(expr.toCharArray(),pos,SimpleCharStream.getPosition()),
+                          expr,
                           ClassAccess.NORMAL);}
 |
   <LBRACKET> [ expression = Expression() | expression = Type() ]  //Not good
@@ -1910,7 +1972,7 @@ Define defineStatement() :
     errorLevel   = ERROR;
     errorStart   = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd     = SimpleCharStream.getPosition() + 1;
-    processParseException(e);
+    processParseExceptionDebug(e);
   }
   try {
     defineName = Expression()
@@ -1928,7 +1990,7 @@ Define defineStatement() :
     errorLevel   = ERROR;
     errorStart   = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd     = SimpleCharStream.getPosition() + 1;
-    processParseException(e);
+    processParseExceptionDebug(e);
   }
   try {
     defineValue = Expression()
@@ -1946,7 +2008,7 @@ Define defineStatement() :
     errorLevel   = ERROR;
     errorStart   = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd     = SimpleCharStream.getPosition() + 1;
-    processParseException(e);
+    processParseExceptionDebug(e);
   }
   {return new Define(currentSegment,
                      defineName,
@@ -2051,7 +2113,7 @@ PrintExpression PrintExpression() :
 
 ListExpression ListExpression() :
 {
-  String expr = null;
+  Expression expr = null;
   final Expression expression;
   final ArrayList list = new ArrayList();
   final int pos = SimpleCharStream.getPosition();
@@ -2095,17 +2157,17 @@ ListExpression ListExpression() :
   }
   [ <ASSIGN> expression = Expression()
     {
-    final String[] strings = new String[list.size()];
-    list.toArray(strings);
-    return new ListExpression(strings,
+    final Variable[] vars = new Variable[list.size()];
+    list.toArray(vars);
+    return new ListExpression(vars,
                               expression,
                               pos,
                               SimpleCharStream.getPosition());}
   ]
   {
-    final String[] strings = new String[list.size()];
-    list.toArray(strings);
-    return new ListExpression(strings,pos,SimpleCharStream.getPosition());}
+    final Variable[] vars = new Variable[list.size()];
+    list.toArray(vars);
+    return new ListExpression(vars,pos,SimpleCharStream.getPosition());}
 }
 
 /**
@@ -2144,25 +2206,25 @@ EchoStatement EchoStatement() :
 GlobalStatement GlobalStatement() :
 {
    final int pos = SimpleCharStream.getPosition();
-   String expr;
+   Variable expr;
    final ArrayList vars = new ArrayList();
    final GlobalStatement global;
 }
 {
   <GLOBAL>
-    expr = VariableDeclaratorId()
+    expr = Variable()
     {vars.add(expr);}
   (<COMMA>
-    expr = VariableDeclaratorId()
+    expr = Variable()
     {vars.add(expr);}
   )*
   try {
     <SEMICOLON>
     {
-    final String[] strings = new String[vars.size()];
-    vars.toArray(strings);
+    final Variable[] variables = new Variable[vars.size()];
+    vars.toArray(variables);
     global = new GlobalStatement(currentSegment,
-                                 strings,
+                                 variables,
                                  pos,
                                  SimpleCharStream.getPosition());
     currentSegment.add(global);
@@ -2183,16 +2245,18 @@ StaticStatement StaticStatement() :
   VariableDeclaration expr;
 }
 {
-  <STATIC> expr = VariableDeclarator() {vars.add(new String(expr.name()));}
-  (<COMMA> expr = VariableDeclarator() {vars.add(new String(expr.name()));})*
+  <STATIC> expr = VariableDeclarator() {vars.add(expr);}
+  (
+    <COMMA> expr = VariableDeclarator() {vars.add(expr);}
+  )*
   try {
     <SEMICOLON>
     {
-    final String[] strings = new String[vars.size()];
-    vars.toArray(strings);
-    return new StaticStatement(strings,
-                                pos,
-                                SimpleCharStream.getPosition());}
+    final VariableDeclaration[] variables = new VariableDeclaration[vars.size()];
+    vars.toArray(variables);
+    return new StaticStatement(variables,
+                               pos,
+                               SimpleCharStream.getPosition());}
   } catch (ParseException e) {
     errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. a ';' was expected";
     errorLevel   = ERROR;
@@ -2305,24 +2369,24 @@ VariableDeclaration[] LocalVariableDeclaration() :
  */
 VariableDeclaration LocalVariableDeclarator() :
 {
-  final String varName;
+  final Variable varName;
   Expression initializer = null;
   final int pos = SimpleCharStream.getPosition();
 }
 {
-  varName = VariableDeclaratorId() [ <ASSIGN> initializer = Expression() ]
+  varName = Variable() [ <ASSIGN> initializer = Expression() ]
   {
    if (initializer == null) {
     return new VariableDeclaration(currentSegment,
-                                  new Variable(varName.toCharArray(),SimpleCharStream.getPosition()-varName.length(),SimpleCharStream.getPosition()),
-                                  pos,
-                                  SimpleCharStream.getPosition());
+                                   varName,
+                                   pos,
+                                   SimpleCharStream.getPosition());
    }
     return new VariableDeclaration(currentSegment,
-                                    new Variable(varName.toCharArray(),SimpleCharStream.getPosition()-varName.length(),SimpleCharStream.getPosition()),
-                                    initializer,
-                                    VariableDeclaration.EQUAL,
-                                    pos);
+                                   varName,
+                                   initializer,
+                                   VariableDeclaration.EQUAL,
+                                   pos);
   }
 }
 
@@ -2579,7 +2643,7 @@ Expression Condition(final String keyword) :
     errorLevel   = ERROR;
     errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length();
     errorEnd   = errorStart +1;
-    processParseException(e);
+    processParseExceptionDebug(e);
   }
   condition = Expression()
   try {
@@ -2589,7 +2653,7 @@ Expression Condition(final String keyword) :
     errorLevel   = ERROR;
     errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd   = SimpleCharStream.getPosition() + 1;
-    processParseException(e);
+    processParseExceptionDebug(e);
   }
   {return condition;}
 }