[jboss-svn-commits] JBL Code SVN: r23223 - in labs/jbosstm/workspace/adinn/orchestration: dd/grammar and 7 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Sep 30 09:44:48 EDT 2008


Author: adinn
Date: 2008-09-30 09:44:48 -0400 (Tue, 30 Sep 2008)
New Revision: 23223

Added:
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/exception/ThrowException.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ThrowExpression.java
Modified:
   labs/jbosstm/workspace/adinn/orchestration/dd/grammar/ECAGrammar.g
   labs/jbosstm/workspace/adinn/orchestration/dd/grammar/ECAToken.g
   labs/jbosstm/workspace/adinn/orchestration/handler.txt
   labs/jbosstm/workspace/adinn/orchestration/src/TestJar.java
   labs/jbosstm/workspace/adinn/orchestration/src/TestRule.java
   labs/jbosstm/workspace/adinn/orchestration/src/TestScript.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/agent/RuleAdapter.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Rule.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ExpressionHelper.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/MethodExpression.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECAGrammarParser.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECATokenLexer.java
   labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/type/TypeGroup.java
Log:
allowed throw expression in actions for exceptions in the trigger method throws list or runtime exceptions

Modified: labs/jbosstm/workspace/adinn/orchestration/dd/grammar/ECAGrammar.g
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/dd/grammar/ECAGrammar.g	2008-09-30 13:06:38 UTC (rev 23222)
+++ labs/jbosstm/workspace/adinn/orchestration/dd/grammar/ECAGrammar.g	2008-09-30 13:44:48 UTC (rev 23223)
@@ -93,8 +93,10 @@
 	|	action_expr
 	;
 
-action_expr	:	RETURN		-> ^(RETURN)
-	|	RETURN expr		-> ^(RETURN expr)
+action_expr	:	RETURN				-> ^(RETURN)
+	|	RETURN expr				-> ^(RETURN expr)
+	|	THROW e=SYMBOL LPAREN RPAREN		-> ^(THROW $e)
+	|	THROW e=SYMBOL LPAREN args=expr_list RPAREN	-> ^(THROW $e $args)
 	|	expr
 	;
 

Modified: labs/jbosstm/workspace/adinn/orchestration/dd/grammar/ECAToken.g
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/dd/grammar/ECAToken.g	2008-09-30 13:06:38 UTC (rev 23222)
+++ labs/jbosstm/workspace/adinn/orchestration/dd/grammar/ECAToken.g	2008-09-30 13:44:48 UTC (rev 23223)
@@ -79,6 +79,9 @@
 RETURN	:	'RETURN'|'return'
 	;
 	
+THROW	:	'THROW'|'throw'
+	;
+	
 // various bracket pairs
 
 LPAREN	:	'('

Modified: labs/jbosstm/workspace/adinn/orchestration/handler.txt
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/handler.txt	2008-09-30 13:06:38 UTC (rev 23222)
+++ labs/jbosstm/workspace/adinn/orchestration/handler.txt	2008-09-30 13:44:48 UTC (rev 23223)
@@ -178,7 +178,7 @@
 LINE 76
 BIND coordinator = $0,
      uid : Uid = coordinator.identifier(),
-     status : int = coordinator.status(),
+     status : int = coordinator.status()
 IF (status == com.arjuna.ats.arjuna.coordinator.ActionStatus.PREPARED)
      OR
      (status == com.arjuna.ats.arjuna.coordinator.ActionStatus.COMMITTING)

Modified: labs/jbosstm/workspace/adinn/orchestration/src/TestJar.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/TestJar.java	2008-09-30 13:06:38 UTC (rev 23222)
+++ labs/jbosstm/workspace/adinn/orchestration/src/TestJar.java	2008-09-30 13:44:48 UTC (rev 23223)
@@ -112,6 +112,12 @@
                                     }
                                     found = true;
                                     int access = 0;
+                                    Class<?>[] exceptionClasses = method.getExceptionTypes();
+                                    int l = exceptionClasses.length;
+                                    String[] exceptionNames = new String[l];
+                                    for (int i = 0; i < l; i++) {
+                                        exceptionNames[i] = exceptionClasses[i].getCanonicalName();
+                                    }
                                     if ((candidate.getModifiers() & Modifier.STATIC) != 0) {
                                         access = Opcodes.ACC_STATIC;
                                     }
@@ -121,7 +127,7 @@
                                     Rule rule = Rule.create(ruleName, targetClassName, targetMethodName, targetLine, event, condition, action, loader);
                                     System.err.println("TestJar: parsed rule " + ruleName);
                                     System.err.println(rule);
-                                    rule.setTypeInfo(targetClassName, access, candidateName, candidateDesc);
+                                    rule.setTypeInfo(targetClassName, access, candidateName, candidateDesc, exceptionNames);
                                     rule.typeCheck();
                                     System.err.println("TestJar: type checked rule " + ruleName);
                                 }
@@ -142,6 +148,12 @@
                                         }
                                         found = true;
                                         int access = 0;
+                                        Class<?>[] exceptionClasses = constructor.getExceptionTypes();
+                                        int l = exceptionClasses.length;
+                                        String[] exceptionNames = new String[l];
+                                        for (int i = 0; i < l; i++) {
+                                            exceptionNames[i] = exceptionClasses[i].getCanonicalName();
+                                        }
                                         if ((constructor.getModifiers() & Modifier.STATIC) != 0) {
                                             access = Opcodes.ACC_STATIC;
                                         }
@@ -151,7 +163,7 @@
                                         Rule rule = Rule.create(ruleName, targetClassName, targetMethodName, targetLine, event, condition, action, loader);
                                         System.err.println("TestJar: parsed rule " + ruleName);
                                         System.err.println(rule);
-                                        rule.setTypeInfo(targetClassName, access, candidateName, candidateDesc);
+                                        rule.setTypeInfo(targetClassName, access, candidateName, candidateDesc, exceptionNames);
                                         rule.typeCheck();
                                         System.err.println("TestJar: type checked rule " + ruleName);
                                     }

Modified: labs/jbosstm/workspace/adinn/orchestration/src/TestRule.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/TestRule.java	2008-09-30 13:06:38 UTC (rev 23222)
+++ labs/jbosstm/workspace/adinn/orchestration/src/TestRule.java	2008-09-30 13:44:48 UTC (rev 23223)
@@ -162,10 +162,16 @@
                 try {
                     int modifiers = method.getModifiers();
                     int access = 0;
+                    Class<?>[] exceptionClasses = method.getExceptionTypes();
+                    int l = exceptionClasses.length;
+                    String[] exceptionNames = new String[l];
+                    for (int i = 0; i < l; i++) {
+                        exceptionNames[i] = exceptionClasses[i].getCanonicalName();
+                    }
                     if ((modifiers & Modifier.STATIC) != 0) {
                         access |= Opcodes.ACC_STATIC;
                     }
-                    rule.setTypeInfo(className, access, methodName,  descriptor);
+                    rule.setTypeInfo(className, access, methodName,  descriptor, exceptionNames);
                     rule.typeCheck();
                 } catch (TypeException te) {
                     System.out.println("error typechecking against " + className + "." + methodName + " : " + te);

Modified: labs/jbosstm/workspace/adinn/orchestration/src/TestScript.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/TestScript.java	2008-09-30 13:06:38 UTC (rev 23222)
+++ labs/jbosstm/workspace/adinn/orchestration/src/TestScript.java	2008-09-30 13:44:48 UTC (rev 23223)
@@ -164,10 +164,16 @@
                                     }
                                     found = true;
                                     int access = 0;
+                                    Class<?>[] exceptionClasses = candidate.getExceptionTypes();
+                                    int l = exceptionClasses.length;
+                                    String[] exceptionNames = new String[l];
+                                    for (int i = 0; i < l; i++) {
+                                        exceptionNames[i] = exceptionClasses[i].getCanonicalName();
+                                    }
                                     if ((candidate.getModifiers() & Modifier.STATIC) != 0) {
                                         access = Opcodes.ACC_STATIC;
                                     }
-                                    rule.setTypeInfo(targetClassName, access, candidateName, candidateDesc);
+                                    rule.setTypeInfo(targetClassName, access, candidateName, candidateDesc, exceptionNames);
                                     rule.typeCheck();
                                     System.err.println("TestJar: type checked rule " + ruleName);
                                 }
@@ -187,10 +193,16 @@
                                     }
                                     found = true;
                                     int access = 0;
+                                    Class<?>[] exceptionClasses = constructor.getExceptionTypes();
+                                    int l = exceptionClasses.length;
+                                    String[] exceptionNames = new String[l];
+                                    for (int i = 0; i < l; i++) {
+                                        exceptionNames[i] = exceptionClasses[i].getCanonicalName();
+                                    }
                                     if ((constructor.getModifiers() & Modifier.STATIC) != 0) {
                                         access = Opcodes.ACC_STATIC;
                                     }
-                                    rule.setTypeInfo(targetClassName, access, candidateName, candidateDesc);
+                                    rule.setTypeInfo(targetClassName, access, candidateName, candidateDesc, exceptionNames);
                                     rule.typeCheck();
                                     System.err.println("TestJar: type checked rule " + ruleName);
                                 }

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/agent/RuleAdapter.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/agent/RuleAdapter.java	2008-09-30 13:06:38 UTC (rev 23222)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/agent/RuleAdapter.java	2008-09-30 13:44:48 UTC (rev 23223)
@@ -94,7 +94,7 @@
 
         public void visitLineNumber(final int line, final Label start) {
             if (!visitedLine && (targetLine < 0 || targetLine == line)) {
-                rule.setTypeInfo(targetClass, access, name, descriptor);
+                rule.setTypeInfo(targetClass, access, name, descriptor, exceptions);
                 String key = rule.getKey();
                 Type ruleType = Type.getType(TypeHelper.externalizeType("org.jboss.jbossts.orchestration.rule.Rule"));
                 Method method = Method.getMethod("void execute(String, Object, Object[])");
@@ -152,6 +152,8 @@
              */
             Type exceptionType = Type.getType(TypeHelper.externalizeType("org.jboss.jbossts.orchestration.rule.exception.ExecuteException"));
             Type earlyReturnExceptionType = Type.getType(TypeHelper.externalizeType("org.jboss.jbossts.orchestration.rule.exception.EarlyReturnException"));
+            Type throwExceptionType = Type.getType(TypeHelper.externalizeType("org.jboss.jbossts.orchestration.rule.exception.ThrowException"));
+            Type throwableType = Type.getType(TypeHelper.externalizeType("java.lang.Throwable"));
             Type returnType =  Type.getReturnType(descriptor);
             // add exception handling code subclass first
             super.catchException(startLabel, endLabel, earlyReturnExceptionType);
@@ -166,6 +168,12 @@
                 super.unbox(returnType);
                 super.returnValue();
             }
+            super.catchException(startLabel, endLabel, throwExceptionType);
+            // fetch value from exception, unbox if needed and return value
+            Method getThrowableMethod = Method.getMethod("Throwable getThrowable()");
+            super.invokeVirtual(throwExceptionType, getThrowableMethod);
+            super.throwException();
+
             super.catchException(startLabel, endLabel, exceptionType);
             super.throwException(exceptionType, rule.getName() + " execution exception ");
             // ok now recompute the stack size

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Rule.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Rule.java	2008-09-30 13:06:38 UTC (rev 23222)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/Rule.java	2008-09-30 13:44:48 UTC (rev 23223)
@@ -90,6 +90,11 @@
      */
     private String triggerDescriptor;
     /**
+     * the name sof all the exceptions declared by the trigger method in which a trigger call for
+     * this rule has been inserted by the code transformation package.
+     */
+    private String[] triggerExceptions;
+    /**
      * the access mode for the target method defined using flag bits defined in the asm Opcodes
      * class.
      */
@@ -300,12 +305,13 @@
         }
     }
 
-    public void setTypeInfo(final String className, final int access, final String methodName, final String desc)
+    public void setTypeInfo(final String className, final int access, final String methodName, final String desc, String[] exceptions)
     {
         triggerClass = className;
         triggerAccess = access;
         triggerMethod = methodName;
         triggerDescriptor = desc;
+        triggerExceptions = exceptions;
     }
 
     private synchronized boolean ensureTypeCheckedCompiled()
@@ -333,6 +339,9 @@
     public void typeCheck()
             throws TypeException
     {
+        // ensure that the type group includes the exception types
+        typeGroup.addExceptionTypes(triggerExceptions);
+
         // try to resolve all types in the type group to classes
 
         typeGroup.resolveTypes();

Added: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/exception/ThrowException.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/exception/ThrowException.java	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/exception/ThrowException.java	2008-09-30 13:44:48 UTC (rev 23223)
@@ -0,0 +1,23 @@
+package org.jboss.jbossts.orchestration.rule.exception;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: adinn
+ * Date: 30-Sep-2008
+ * Time: 13:37:55
+ * To change this template use File | Settings | File Templates.
+ */
+public class ThrowException extends ExecuteException
+{
+    private Throwable throwable;
+
+    public ThrowException(Throwable throwable) {
+        super("wrapper for exception created in throw expression", throwable);
+        this.throwable = throwable;
+    }
+
+    public Throwable getThrowable()
+    {
+        return throwable;
+    }
+}

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ExpressionHelper.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ExpressionHelper.java	2008-09-30 13:06:38 UTC (rev 23222)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ExpressionHelper.java	2008-09-30 13:44:48 UTC (rev 23223)
@@ -35,6 +35,8 @@
         //                     (ARRAY SYMBOL idx_list)
         //                     (METH SYMBOL)
         //                     (METH SYMBOL expr_list)
+        //                     (THROW SYMBOL)
+        //                     (THROW SYMBOL expr_list)
         //                     (NUMBER)
         //                     (STRING)
         //                     (RETURN)
@@ -153,6 +155,23 @@
                 }
             }
             break;
+            case THROW:
+            {
+                CommonTree child0 = (CommonTree) exprTree.getChild(0);
+                CommonTree child1;
+                if (exprTree.getChildCount() > 1) {
+                    child1 = (CommonTree) exprTree.getChild(1);
+                } else {
+                    child1 = null;
+                }
+                token = child0.getToken();
+                if (token.getType() != SYMBOL) {
+                    throw new TypeException("ExpressionHelper.createExpression : unexpected token Type in throw expression tree " + tokenType + " for token " + token.getText() + " @ " + token.getLine() + "." + token.getCharPositionInLine());
+                } else {
+                    expr = createThrowExpression(bindings, token, child1, type);
+                }
+            }
+            break;
             case NUMBER:
             {
                 expr = new NumericLiteral(token);
@@ -280,6 +299,26 @@
          return expr;
      }
 
+    public static Expression createThrowExpression(Bindings bindings, Token token, CommonTree argTree, Type type)
+            throws TypeException
+    {
+        Expression expr;
+        String className;
+        List<Expression> args;
+
+        String typeName = token.getText();
+
+        if (argTree == null) {
+            args = new ArrayList<Expression>();
+        } else {
+            args = createExpressionList(bindings, argTree);
+        }
+
+        expr = new ThrowExpression(typeName, token, args);
+
+        return expr;
+    }
+
     public static Expression createUnaryExpression(Bindings bindings, CommonTree exprTree, Type type)
             throws TypeException
     {

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/MethodExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/MethodExpression.java	2008-09-30 13:06:38 UTC (rev 23222)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/MethodExpression.java	2008-09-30 13:44:48 UTC (rev 23223)
@@ -122,7 +122,7 @@
         type = typegroup.ensureType(method.getReturnType());
 
         if (Type.dereference(expected).isDefined() && !expected.isAssignableFrom(type)) {
-            throw new TypeException("FieldExpresssion.typeCheck : invalid expected type " + expected.getName() + getPos());
+            throw new TypeException("MethodExpression.typeCheck : invalid expected type " + expected.getName() + getPos());
         }
 
         return type;

Added: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ThrowExpression.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ThrowExpression.java	                        (rev 0)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/expression/ThrowExpression.java	2008-09-30 13:44:48 UTC (rev 23223)
@@ -0,0 +1,234 @@
+package org.jboss.jbossts.orchestration.rule.expression;
+
+import org.jboss.jbossts.orchestration.rule.binding.Bindings;
+import org.jboss.jbossts.orchestration.rule.type.Type;
+import org.jboss.jbossts.orchestration.rule.type.TypeGroup;
+import org.jboss.jbossts.orchestration.rule.exception.TypeException;
+import org.jboss.jbossts.orchestration.rule.exception.ExecuteException;
+import org.jboss.jbossts.orchestration.rule.exception.ThrowException;
+import org.jboss.jbossts.orchestration.rule.Rule;
+import org.antlr.runtime.Token;
+
+import java.io.StringWriter;
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.ListIterator;
+import java.lang.reflect.Method;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: adinn
+ * Date: 30-Sep-2008
+ * Time: 11:12:41
+ * To change this template use File | Settings | File Templates.
+ */
+public class ThrowExpression extends Expression
+{
+    private String typeName;
+    private List<Expression> arguments;
+    private List<Type> argumentTypes;
+    private Constructor constructor;
+
+    public ThrowExpression(String typeName, Token token, List<Expression> arguments) {
+        super(Type.UNDEFINED, token);
+        this.typeName = typeName;
+        this.arguments = arguments;
+        this.argumentTypes = null;
+        this.constructor = null;
+    }
+    /**
+     * verify that variables mentioned in this expression are actually available in the supplied
+     * bindings list and infer/validate the type of this expression or its subexpressions
+     * where possible
+     *
+     * @param bindings the set of bindings in place at the point of evaluation of this expression
+     * @return true if all variables in this expression are bound and no type mismatches have
+     *         been detected during inference/validation.
+     */
+    public boolean bind(Bindings bindings) {
+        // check that the recipient and argument expressions have valid bindings
+
+        boolean valid = true;
+        Iterator<Expression> iterator = arguments.iterator();
+
+        while (valid && iterator.hasNext()) {
+            valid &= iterator.next().bind(bindings);
+        }
+
+        return valid;
+    }
+
+    /**
+     * ensure that all type references in the expression and its component expressions
+     * can be resolved, that the type of the expression is well-defined and that it is
+     * compatible with the type expected in the context in which it occurs.
+     *
+     * @param bindings  the bound variable in scope at the point where the expression is
+     *                  to be evaluate
+     * @param typegroup the set of types employed by the rule
+     * @param expected  the type expected for the expression in the contxt in which it occurs. this
+     *                  may be void but shoudl not be undefined at the point where type checking is performed.
+     * @return
+     * @throws org.jboss.jbossts.orchestration.rule.exception.TypeException
+     *
+     */
+    public Type typeCheck(Bindings bindings, TypeGroup typegroup, Type expected) throws TypeException {
+        // check the exception type is defined and then look for a relevant constructor
+
+        type = Type.dereference(typegroup.create(typeName));
+
+        if (type.isUndefined()) {
+            throw new TypeException("ThrowExpression.typeCheck : unknown exception type " + typeName + getPos());
+        }
+
+        if (!Throwable.class.isAssignableFrom(type.getTargetClass())) {
+            throw new TypeException("ThrowExpression.typeCheck : not an exception type " + typeName  + getPos());
+        }
+
+        Class clazz = type.getTargetClass();
+        // if we can find a unique method then we can use it to type the parameters
+        // otherwise we do it the hard way
+        int arity = arguments.size();
+        Constructor[] constructors = clazz.getConstructors();
+        List<Constructor> candidates = new ArrayList<Constructor>();
+        boolean duplicates = false;
+
+        for (Constructor constructor : constructors) {
+            if (constructor.getParameterTypes().length == arity) {
+                candidates.add(constructor);
+            }
+        }
+
+        argumentTypes = new ArrayList<Type>();
+
+        // check each argument in turn -- if all candidates have the same argument type then
+        // use that as the type to check against
+        for (int i = 0; i < arguments.size() ; i++) {
+            if (candidates.isEmpty()) {
+                throw new TypeException("ThrowExpression.typeCheck : invalid constructor for target class " + typeName + getPos());
+            }
+
+            // TODO get and prune operations do not allow for coercion but type check does!
+            // e.g. the parameter type may be int and the arg type float
+            // or the parameter type may be String and the arg type class Foo
+            // reimplement this using type inter-assignability to do the pruning
+
+            Class candidateClass = getCandidateArgClass(candidates, i);
+            Type candidateType;
+            if (candidateClass != null) {
+                candidateType = typegroup.ensureType(candidateClass);
+            } else {
+                candidateType = Type.UNDEFINED;
+            }
+            Type argType = arguments.get(i).typeCheck(bindings, typegroup, candidateType);
+            argumentTypes.add(argType);
+            if (candidateType == Type.UNDEFINED) {
+                // we had several constructors to choose from
+                candidates = pruneCandidates(candidates, i, argType.getTargetClass());
+            }
+        }
+
+        if (candidates.isEmpty()) {
+            throw new TypeException("ThrowExpression.typeCheck : invalid method for target class " + typeName + getPos());
+        }
+
+        if (candidates.size() > 1) {
+            throw new TypeException("ThrowExpression.typeCheck : ambiguous method signature for target class " + typeName + getPos());
+        }
+
+        constructor = candidates.get(0);
+
+        // expected type should always be void since throw can only occur as a top level action
+        // however, we need to be sure that the trigering method throws this exception type or
+        // else that it is a subtype of runtime exception
+
+        if (RuntimeException.class.isAssignableFrom(type.getTargetClass())) {
+            return type;
+        } else {
+            Iterator<Type> iterator = typegroup.getExceptionTypes().iterator();
+            while (iterator.hasNext()) {
+                Type exceptionType = iterator.next();
+                if (Type.dereference(exceptionType).isAssignableFrom(type)) {
+                    // ok we foudn a suitable declaration for the exception
+                    return type;
+                }
+            }
+            // didn't find a suitable type in the method type list
+            throw new TypeException("ThrowExpression.typeCheck : exception type not declared by trigger method "  + typeName + getPos());
+        }
+    }
+
+    public Class getCandidateArgClass(List<Constructor> candidates, int argIdx)
+    {
+        Class argClazz = null;
+
+        for (Constructor c : candidates) {
+            Class nextClazz = c.getParameterTypes()[argIdx];
+            if (argClazz == null) {
+                argClazz = nextClazz;
+            } else if (argClazz != nextClazz) {
+                return null;
+            }
+        }
+
+        return argClazz;
+    }
+
+    public List<Constructor> pruneCandidates(List<Constructor> candidates, int argIdx, Class argClazz)
+    {
+        for (int i = 0; i < candidates.size();) {
+            Constructor c = candidates.get(i);
+            Class nextClazz = c.getParameterTypes()[argIdx];
+            if (nextClazz != argClazz) {
+                candidates.remove(i);
+            } else {
+                i++;
+            }
+        }
+        return candidates;
+    }
+
+    /**
+     * evaluate the expression by interpreting the expression tree
+     *
+     * @param helper an execution context associated with the rule whcih contains a map of
+     *               current bindings for rule variables and another map of their declared types both of which
+     *               are indexed by varoable name. This includes entries for the helper (name "-1"), the
+     *               recipient if the trigger method is not static (name "0") and the trigger method arguments
+     *               (names "1", ...)
+     * @return the result of evaluation as an Object
+     * @throws org.jboss.jbossts.orchestration.rule.exception.ExecuteException
+     *
+     */
+    public Object interpret(Rule.BasicHelper helper) throws ExecuteException {
+        int l = arguments.size();
+        int i;
+        Object[] callArgs = new Object[l];
+        for (i =0; i < l; i++) {
+            callArgs[i] = arguments.get(i).interpret(helper);
+        }
+        try {
+            Throwable th = (Throwable) constructor.newInstance(callArgs);
+            ThrowException thex = new ThrowException(th);
+            throw thex;
+        } catch (InstantiationException e) {
+            throw new ExecuteException("ThrowExpression.interpret : unable to instantiate exception class " + typeName + getPos(), e);
+        } catch (IllegalAccessException e) {
+            throw new ExecuteException("ThrowExpression.interpret : unable to access exception class " + typeName + getPos(), e);
+        } catch (InvocationTargetException e) {
+            throw new ExecuteException("ThrowExpression.interpret : unable to invoke exception class constructor for " + typeName + getPos(), e);
+        }
+    }
+
+    public void writeTo(StringWriter stringWriter) {
+        stringWriter.write("throw " + type.getName() + "(");
+        for (Expression argument : arguments) {
+            argument.writeTo(stringWriter);
+        }
+        stringWriter.write(")");
+
+    }
+}

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECAGrammarParser.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECAGrammarParser.java	2008-09-30 13:06:38 UTC (rev 23222)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECAGrammarParser.java	2008-09-30 13:44:48 UTC (rev 23223)
@@ -1,4 +1,4 @@
-// $ANTLR 3.0.1 dd/grammar/ECAGrammar.g 2008-09-25 12:22:36
+// $ANTLR 3.0.1 dd/grammar/ECAGrammar.g 2008-09-30 13:45:25
 
 package org.jboss.jbossts.orchestration.rule.grammar;
 
@@ -14,86 +14,87 @@
 
 public class ECAGrammarParser extends Parser {
     public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "DIGIT", "POSDIGIT", "SIGN", "BAREINT", "INTEGER", "POINT", "EXPPART", "FLOAT", "NUMBER", "BIND", "IF", "DO", "RULE", "CLASS", "METHOD", "LINE", "ENDRULE", "NOTHING", "TRUE", "FALSE", "RETURN", "LPAREN", "RPAREN", "LSQUARE", "RSQUARE", "LBRACE", "RBRACE", "SEPR", "DOT", "ASSIGN", "OR", "AND", "NOT", "EQ", "NEQ", "GT", "LT", "GEQ", "LEQ", "BOR", "BAND", "BXOR", "TWIDDLE", "MUL", "DIV", "PLUS", "MINUS", "MOD", "TERN_IF", "COLON", "LETTER", "UNDERSCORE", "QUOTE", "DQUOTE", "SPACE", "NEWLINE", "PUNCT", "STRING", "BARESYM", "QUOTSYM", "DOTSYM", "SYMBOL", "DOLLAR", "DOLLARSYM", "WS", "Tokens", "UNOP", "BINOP", "TERNOP", "METH", "ARRAY", "NUM_LIT", "STRING_LIT"
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "DIGIT", "POSDIGIT", "SIGN", "BAREINT", "INTEGER", "POINT", "EXPPART", "FLOAT", "NUMBER", "BIND", "IF", "DO", "RULE", "CLASS", "METHOD", "LINE", "ENDRULE", "NOTHING", "TRUE", "FALSE", "RETURN", "THROW", "LPAREN", "RPAREN", "LSQUARE", "RSQUARE", "LBRACE", "RBRACE", "SEPR", "DOT", "ASSIGN", "OR", "AND", "NOT", "EQ", "NEQ", "GT", "LT", "GEQ", "LEQ", "BOR", "BAND", "BXOR", "TWIDDLE", "MUL", "DIV", "PLUS", "MINUS", "MOD", "TERN_IF", "COLON", "LETTER", "UNDERSCORE", "QUOTE", "DQUOTE", "SPACE", "NEWLINE", "PUNCT", "STRING", "BARESYM", "QUOTSYM", "DOTSYM", "SYMBOL", "DOLLAR", "DOLLARSYM", "WS", "Tokens", "UNOP", "BINOP", "TERNOP", "METH", "ARRAY", "NUM_LIT", "STRING_LIT"
     };
-    public static final int MINUS=50;
-    public static final int ARRAY=74;
+    public static final int MINUS=51;
+    public static final int ARRAY=75;
     public static final int NUMBER=12;
     public static final int FALSE=23;
     public static final int METHOD=18;
     public static final int FLOAT=11;
     public static final int POSDIGIT=5;
-    public static final int LEQ=42;
-    public static final int TWIDDLE=46;
+    public static final int LEQ=43;
+    public static final int TWIDDLE=47;
     public static final int RULE=16;
-    public static final int MOD=51;
-    public static final int GEQ=41;
-    public static final int DQUOTE=57;
-    public static final int BOR=43;
-    public static final int OR=34;
-    public static final int STRING_LIT=76;
+    public static final int MOD=52;
+    public static final int GEQ=42;
+    public static final int DQUOTE=58;
+    public static final int OR=35;
+    public static final int BOR=44;
+    public static final int STRING_LIT=77;
     public static final int BAREINT=7;
-    public static final int LBRACE=29;
-    public static final int NEWLINE=59;
-    public static final int DOT=32;
-    public static final int RBRACE=30;
+    public static final int LBRACE=30;
+    public static final int NEWLINE=60;
+    public static final int DOT=33;
+    public static final int RBRACE=31;
     public static final int INTEGER=8;
-    public static final int AND=35;
-    public static final int NUM_LIT=75;
-    public static final int ASSIGN=33;
-    public static final int SYMBOL=65;
-    public static final int RPAREN=26;
+    public static final int AND=36;
+    public static final int NUM_LIT=76;
+    public static final int ASSIGN=34;
+    public static final int SYMBOL=66;
+    public static final int RPAREN=27;
     public static final int SIGN=6;
-    public static final int LPAREN=25;
-    public static final int METH=73;
-    public static final int PLUS=49;
+    public static final int LPAREN=26;
+    public static final int METH=74;
+    public static final int PLUS=50;
     public static final int DIGIT=4;
     public static final int LINE=19;
-    public static final int BINOP=71;
-    public static final int BAND=44;
-    public static final int NEQ=38;
-    public static final int TERNOP=72;
-    public static final int SPACE=58;
-    public static final int LETTER=54;
-    public static final int LSQUARE=27;
+    public static final int BINOP=72;
+    public static final int BAND=45;
+    public static final int NEQ=39;
+    public static final int TERNOP=73;
+    public static final int SPACE=59;
+    public static final int LETTER=55;
+    public static final int LSQUARE=28;
     public static final int DO=15;
     public static final int POINT=9;
-    public static final int BARESYM=62;
+    public static final int BARESYM=63;
     public static final int NOTHING=21;
-    public static final int SEPR=31;
-    public static final int WS=68;
-    public static final int EQ=37;
-    public static final int STRING=61;
-    public static final int QUOTSYM=63;
-    public static final int LT=40;
-    public static final int GT=39;
-    public static final int DOLLAR=66;
-    public static final int RSQUARE=28;
-    public static final int TERN_IF=52;
-    public static final int QUOTE=56;
-    public static final int UNOP=70;
+    public static final int SEPR=32;
+    public static final int WS=69;
+    public static final int EQ=38;
+    public static final int STRING=62;
+    public static final int QUOTSYM=64;
+    public static final int LT=41;
+    public static final int GT=40;
+    public static final int DOLLAR=67;
+    public static final int RSQUARE=29;
+    public static final int TERN_IF=53;
+    public static final int QUOTE=57;
+    public static final int UNOP=71;
     public static final int CLASS=17;
-    public static final int MUL=47;
+    public static final int MUL=48;
     public static final int EXPPART=10;
-    public static final int PUNCT=60;
+    public static final int PUNCT=61;
     public static final int RETURN=24;
     public static final int IF=14;
     public static final int EOF=-1;
-    public static final int Tokens=69;
-    public static final int COLON=53;
-    public static final int DIV=48;
-    public static final int DOTSYM=64;
-    public static final int BXOR=45;
+    public static final int Tokens=70;
+    public static final int COLON=54;
+    public static final int DIV=49;
+    public static final int DOTSYM=65;
+    public static final int BXOR=46;
     public static final int ENDRULE=20;
     public static final int BIND=13;
-    public static final int NOT=36;
+    public static final int NOT=37;
     public static final int TRUE=22;
-    public static final int UNDERSCORE=55;
-    public static final int DOLLARSYM=67;
+    public static final int THROW=25;
+    public static final int UNDERSCORE=56;
+    public static final int DOLLARSYM=68;
 
         public ECAGrammarParser(TokenStream input) {
             super(input);
-            ruleMemo = new HashMap[61+1];
+            ruleMemo = new HashMap[63+1];
          }
         
     protected TreeAdaptor adaptor = new CommonTreeAdaptor();
@@ -314,7 +315,7 @@
 
 
             // AST REWRITE
-            // elements: RULE, c, e, a, l, n, cl, m
+            // elements: m, cl, a, n, c, e, RULE, l
             // token labels: cl, m, n, l
             // rule labels: a, c, retval, e
             // token list labels: 
@@ -749,7 +750,7 @@
             if ( backtracking==0 ) stream_action.add(a.getTree());
 
             // AST REWRITE
-            // elements: e, BIND, a, c
+            // elements: BIND, c, a, e
             // token labels: 
             // rule labels: a, c, retval, e
             // token list labels: 
@@ -921,7 +922,7 @@
                     if ( backtracking==0 ) stream_bindings.add(bindings24.getTree());
 
                     // AST REWRITE
-                    // elements: SEPR, bindings, binding
+                    // elements: binding, bindings, SEPR
                     // token labels: 
                     // rule labels: retval
                     // token list labels: 
@@ -1025,7 +1026,7 @@
             if ( backtracking==0 ) stream_expr.add(expr28.getTree());
 
             // AST REWRITE
-            // elements: ASSIGN, expr, bind_sym
+            // elements: expr, ASSIGN, bind_sym
             // token labels: 
             // rule labels: retval
             // token list labels: 
@@ -1143,7 +1144,7 @@
 
 
                     // AST REWRITE
-                    // elements: v, COLON, t
+                    // elements: t, COLON, v
                     // token labels: t, v
                     // rule labels: retval
                     // token list labels: 
@@ -1520,7 +1521,7 @@
                 }
                 }
                 break;
-            case DOLLARSYM:
+            case THROW:
                 {
                 int LA5_2 = input.LA(2);
 
@@ -1539,7 +1540,7 @@
                 }
                 }
                 break;
-            case SYMBOL:
+            case DOLLARSYM:
                 {
                 int LA5_3 = input.LA(2);
 
@@ -1558,7 +1559,7 @@
                 }
                 }
                 break;
-            case NUMBER:
+            case SYMBOL:
                 {
                 int LA5_4 = input.LA(2);
 
@@ -1577,7 +1578,7 @@
                 }
                 }
                 break;
-            case STRING:
+            case NUMBER:
                 {
                 int LA5_5 = input.LA(2);
 
@@ -1596,7 +1597,7 @@
                 }
                 }
                 break;
-            case LPAREN:
+            case STRING:
                 {
                 int LA5_6 = input.LA(2);
 
@@ -1615,8 +1616,7 @@
                 }
                 }
                 break;
-            case NOT:
-            case TWIDDLE:
+            case LPAREN:
                 {
                 int LA5_7 = input.LA(2);
 
@@ -1635,6 +1635,26 @@
                 }
                 }
                 break;
+            case NOT:
+            case TWIDDLE:
+                {
+                int LA5_8 = input.LA(2);
+
+                if ( (synpred6()) ) {
+                    alt5=1;
+                }
+                else if ( (true) ) {
+                    alt5=2;
+                }
+                else {
+                    if (backtracking>0) {failed=true; return retval;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("91:1: action_expr_list : ( action_expr SEPR action_expr_list -> ^( SEPR action_expr action_expr_list ) | action_expr );", 5, 8, input);
+
+                    throw nvae;
+                }
+                }
+                break;
             default:
                 if (backtracking>0) {failed=true; return retval;}
                 NoViableAltException nvae =
@@ -1663,7 +1683,7 @@
                     if ( backtracking==0 ) stream_action_expr_list.add(action_expr_list38.getTree());
 
                     // AST REWRITE
-                    // elements: action_expr_list, SEPR, action_expr
+                    // elements: action_expr, SEPR, action_expr_list
                     // token labels: 
                     // rule labels: retval
                     // token list labels: 
@@ -1730,30 +1750,51 @@
     };
 
     // $ANTLR start action_expr
-    // dd/grammar/ECAGrammar.g:96:1: action_expr : ( RETURN -> ^( RETURN ) | RETURN expr -> ^( RETURN expr ) | expr );
+    // dd/grammar/ECAGrammar.g:96:1: action_expr : ( RETURN -> ^( RETURN ) | RETURN expr -> ^( RETURN expr ) | THROW e= SYMBOL LPAREN RPAREN -> ^( THROW $e) | THROW e= SYMBOL LPAREN args= expr_list RPAREN -> ^( THROW $e $args) | expr );
     public final action_expr_return action_expr() throws RecognitionException {
         action_expr_return retval = new action_expr_return();
         retval.start = input.LT(1);
 
         Object root_0 = null;
 
+        Token e=null;
         Token RETURN40=null;
         Token RETURN41=null;
+        Token THROW43=null;
+        Token LPAREN44=null;
+        Token RPAREN45=null;
+        Token THROW46=null;
+        Token LPAREN47=null;
+        Token RPAREN48=null;
+        expr_list_return args = null;
+
         expr_return expr42 = null;
 
-        expr_return expr43 = null;
+        expr_return expr49 = null;
 
 
+        Object e_tree=null;
         Object RETURN40_tree=null;
         Object RETURN41_tree=null;
+        Object THROW43_tree=null;
+        Object LPAREN44_tree=null;
+        Object RPAREN45_tree=null;
+        Object THROW46_tree=null;
+        Object LPAREN47_tree=null;
+        Object RPAREN48_tree=null;
+        RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
+        RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
         RewriteRuleTokenStream stream_RETURN=new RewriteRuleTokenStream(adaptor,"token RETURN");
+        RewriteRuleTokenStream stream_THROW=new RewriteRuleTokenStream(adaptor,"token THROW");
+        RewriteRuleTokenStream stream_SYMBOL=new RewriteRuleTokenStream(adaptor,"token SYMBOL");
+        RewriteRuleSubtreeStream stream_expr_list=new RewriteRuleSubtreeStream(adaptor,"rule expr_list");
         RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
         try {
-            // dd/grammar/ECAGrammar.g:96:13: ( RETURN -> ^( RETURN ) | RETURN expr -> ^( RETURN expr ) | expr )
-            int alt6=3;
-            int LA6_0 = input.LA(1);
-
-            if ( (LA6_0==RETURN) ) {
+            // dd/grammar/ECAGrammar.g:96:13: ( RETURN -> ^( RETURN ) | RETURN expr -> ^( RETURN expr ) | THROW e= SYMBOL LPAREN RPAREN -> ^( THROW $e) | THROW e= SYMBOL LPAREN args= expr_list RPAREN -> ^( THROW $e $args) | expr )
+            int alt6=5;
+            switch ( input.LA(1) ) {
+            case RETURN:
+                {
                 int LA6_1 = input.LA(2);
 
                 if ( (LA6_1==NUMBER||LA6_1==LPAREN||LA6_1==NOT||LA6_1==TWIDDLE||LA6_1==STRING||LA6_1==SYMBOL||LA6_1==DOLLARSYM) ) {
@@ -1765,21 +1806,72 @@
                 else {
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("96:1: action_expr : ( RETURN -> ^( RETURN ) | RETURN expr -> ^( RETURN expr ) | expr );", 6, 1, input);
+                        new NoViableAltException("96:1: action_expr : ( RETURN -> ^( RETURN ) | RETURN expr -> ^( RETURN expr ) | THROW e= SYMBOL LPAREN RPAREN -> ^( THROW $e) | THROW e= SYMBOL LPAREN args= expr_list RPAREN -> ^( THROW $e $args) | expr );", 6, 1, input);
 
                     throw nvae;
                 }
-            }
-            else if ( (LA6_0==NUMBER||LA6_0==LPAREN||LA6_0==NOT||LA6_0==TWIDDLE||LA6_0==STRING||LA6_0==SYMBOL||LA6_0==DOLLARSYM) ) {
-                alt6=3;
-            }
-            else {
+                }
+                break;
+            case THROW:
+                {
+                int LA6_2 = input.LA(2);
+
+                if ( (LA6_2==SYMBOL) ) {
+                    int LA6_6 = input.LA(3);
+
+                    if ( (LA6_6==LPAREN) ) {
+                        int LA6_7 = input.LA(4);
+
+                        if ( (LA6_7==RPAREN) ) {
+                            alt6=3;
+                        }
+                        else if ( (LA6_7==NUMBER||LA6_7==LPAREN||LA6_7==NOT||LA6_7==TWIDDLE||LA6_7==STRING||LA6_7==SYMBOL||LA6_7==DOLLARSYM) ) {
+                            alt6=4;
+                        }
+                        else {
+                            if (backtracking>0) {failed=true; return retval;}
+                            NoViableAltException nvae =
+                                new NoViableAltException("96:1: action_expr : ( RETURN -> ^( RETURN ) | RETURN expr -> ^( RETURN expr ) | THROW e= SYMBOL LPAREN RPAREN -> ^( THROW $e) | THROW e= SYMBOL LPAREN args= expr_list RPAREN -> ^( THROW $e $args) | expr );", 6, 7, input);
+
+                            throw nvae;
+                        }
+                    }
+                    else {
+                        if (backtracking>0) {failed=true; return retval;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("96:1: action_expr : ( RETURN -> ^( RETURN ) | RETURN expr -> ^( RETURN expr ) | THROW e= SYMBOL LPAREN RPAREN -> ^( THROW $e) | THROW e= SYMBOL LPAREN args= expr_list RPAREN -> ^( THROW $e $args) | expr );", 6, 6, input);
+
+                        throw nvae;
+                    }
+                }
+                else {
+                    if (backtracking>0) {failed=true; return retval;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("96:1: action_expr : ( RETURN -> ^( RETURN ) | RETURN expr -> ^( RETURN expr ) | THROW e= SYMBOL LPAREN RPAREN -> ^( THROW $e) | THROW e= SYMBOL LPAREN args= expr_list RPAREN -> ^( THROW $e $args) | expr );", 6, 2, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case NUMBER:
+            case LPAREN:
+            case NOT:
+            case TWIDDLE:
+            case STRING:
+            case SYMBOL:
+            case DOLLARSYM:
+                {
+                alt6=5;
+                }
+                break;
+            default:
                 if (backtracking>0) {failed=true; return retval;}
                 NoViableAltException nvae =
-                    new NoViableAltException("96:1: action_expr : ( RETURN -> ^( RETURN ) | RETURN expr -> ^( RETURN expr ) | expr );", 6, 0, input);
+                    new NoViableAltException("96:1: action_expr : ( RETURN -> ^( RETURN ) | RETURN expr -> ^( RETURN expr ) | THROW e= SYMBOL LPAREN RPAREN -> ^( THROW $e) | THROW e= SYMBOL LPAREN args= expr_list RPAREN -> ^( THROW $e $args) | expr );", 6, 0, input);
 
                 throw nvae;
             }
+
             switch (alt6) {
                 case 1 :
                     // dd/grammar/ECAGrammar.g:96:15: RETURN
@@ -1800,9 +1892,9 @@
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
 
                     root_0 = (Object)adaptor.nil();
-                    // 96:23: -> ^( RETURN )
+                    // 96:25: -> ^( RETURN )
                     {
-                        // dd/grammar/ECAGrammar.g:96:26: ^( RETURN )
+                        // dd/grammar/ECAGrammar.g:96:28: ^( RETURN )
                         {
                         Object root_1 = (Object)adaptor.nil();
                         root_1 = (Object)adaptor.becomeRoot(stream_RETURN.next(), root_1);
@@ -1820,17 +1912,17 @@
                     // dd/grammar/ECAGrammar.g:97:4: RETURN expr
                     {
                     RETURN41=(Token)input.LT(1);
-                    match(input,RETURN,FOLLOW_RETURN_in_action_expr528); if (failed) return retval;
+                    match(input,RETURN,FOLLOW_RETURN_in_action_expr530); if (failed) return retval;
                     if ( backtracking==0 ) stream_RETURN.add(RETURN41);
 
-                    pushFollow(FOLLOW_expr_in_action_expr530);
+                    pushFollow(FOLLOW_expr_in_action_expr532);
                     expr42=expr();
                     _fsp--;
                     if (failed) return retval;
                     if ( backtracking==0 ) stream_expr.add(expr42.getTree());
 
                     // AST REWRITE
-                    // elements: expr, RETURN
+                    // elements: RETURN, expr
                     // token labels: 
                     // rule labels: retval
                     // token list labels: 
@@ -1840,9 +1932,9 @@
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
 
                     root_0 = (Object)adaptor.nil();
-                    // 97:17: -> ^( RETURN expr )
+                    // 97:19: -> ^( RETURN expr )
                     {
-                        // dd/grammar/ECAGrammar.g:97:20: ^( RETURN expr )
+                        // dd/grammar/ECAGrammar.g:97:22: ^( RETURN expr )
                         {
                         Object root_1 = (Object)adaptor.nil();
                         root_1 = (Object)adaptor.becomeRoot(stream_RETURN.next(), root_1);
@@ -1859,19 +1951,126 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAGrammar.g:98:4: expr
+                    // dd/grammar/ECAGrammar.g:98:4: THROW e= SYMBOL LPAREN RPAREN
                     {
+                    THROW43=(Token)input.LT(1);
+                    match(input,THROW,FOLLOW_THROW_in_action_expr548); if (failed) return retval;
+                    if ( backtracking==0 ) stream_THROW.add(THROW43);
+
+                    e=(Token)input.LT(1);
+                    match(input,SYMBOL,FOLLOW_SYMBOL_in_action_expr552); if (failed) return retval;
+                    if ( backtracking==0 ) stream_SYMBOL.add(e);
+
+                    LPAREN44=(Token)input.LT(1);
+                    match(input,LPAREN,FOLLOW_LPAREN_in_action_expr554); if (failed) return retval;
+                    if ( backtracking==0 ) stream_LPAREN.add(LPAREN44);
+
+                    RPAREN45=(Token)input.LT(1);
+                    match(input,RPAREN,FOLLOW_RPAREN_in_action_expr556); if (failed) return retval;
+                    if ( backtracking==0 ) stream_RPAREN.add(RPAREN45);
+
+
+                    // AST REWRITE
+                    // elements: THROW, e
+                    // token labels: e
+                    // rule labels: retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleTokenStream stream_e=new RewriteRuleTokenStream(adaptor,"token e",e);
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
                     root_0 = (Object)adaptor.nil();
+                    // 98:34: -> ^( THROW $e)
+                    {
+                        // dd/grammar/ECAGrammar.g:98:37: ^( THROW $e)
+                        {
+                        Object root_1 = (Object)adaptor.nil();
+                        root_1 = (Object)adaptor.becomeRoot(stream_THROW.next(), root_1);
 
-                    pushFollow(FOLLOW_expr_in_action_expr544);
-                    expr43=expr();
+                        adaptor.addChild(root_1, stream_e.next());
+
+                        adaptor.addChild(root_0, root_1);
+                        }
+
+                    }
+
+                    }
+
+                    }
+                    break;
+                case 4 :
+                    // dd/grammar/ECAGrammar.g:99:4: THROW e= SYMBOL LPAREN args= expr_list RPAREN
+                    {
+                    THROW46=(Token)input.LT(1);
+                    match(input,THROW,FOLLOW_THROW_in_action_expr571); if (failed) return retval;
+                    if ( backtracking==0 ) stream_THROW.add(THROW46);
+
+                    e=(Token)input.LT(1);
+                    match(input,SYMBOL,FOLLOW_SYMBOL_in_action_expr575); if (failed) return retval;
+                    if ( backtracking==0 ) stream_SYMBOL.add(e);
+
+                    LPAREN47=(Token)input.LT(1);
+                    match(input,LPAREN,FOLLOW_LPAREN_in_action_expr577); if (failed) return retval;
+                    if ( backtracking==0 ) stream_LPAREN.add(LPAREN47);
+
+                    pushFollow(FOLLOW_expr_list_in_action_expr581);
+                    args=expr_list();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) adaptor.addChild(root_0, expr43.getTree());
+                    if ( backtracking==0 ) stream_expr_list.add(args.getTree());
+                    RPAREN48=(Token)input.LT(1);
+                    match(input,RPAREN,FOLLOW_RPAREN_in_action_expr583); if (failed) return retval;
+                    if ( backtracking==0 ) stream_RPAREN.add(RPAREN48);
 
+
+                    // AST REWRITE
+                    // elements: args, THROW, e
+                    // token labels: e
+                    // rule labels: args, retval
+                    // token list labels: 
+                    // rule list labels: 
+                    if ( backtracking==0 ) {
+                    retval.tree = root_0;
+                    RewriteRuleTokenStream stream_e=new RewriteRuleTokenStream(adaptor,"token e",e);
+                    RewriteRuleSubtreeStream stream_args=new RewriteRuleSubtreeStream(adaptor,"token args",args!=null?args.tree:null);
+                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
+
+                    root_0 = (Object)adaptor.nil();
+                    // 99:48: -> ^( THROW $e $args)
+                    {
+                        // dd/grammar/ECAGrammar.g:99:51: ^( THROW $e $args)
+                        {
+                        Object root_1 = (Object)adaptor.nil();
+                        root_1 = (Object)adaptor.becomeRoot(stream_THROW.next(), root_1);
+
+                        adaptor.addChild(root_1, stream_e.next());
+                        adaptor.addChild(root_1, stream_args.next());
+
+                        adaptor.addChild(root_0, root_1);
+                        }
+
                     }
+
+                    }
+
+                    }
                     break;
+                case 5 :
+                    // dd/grammar/ECAGrammar.g:100:4: expr
+                    {
+                    root_0 = (Object)adaptor.nil();
 
+                    pushFollow(FOLLOW_expr_in_action_expr600);
+                    expr49=expr();
+                    _fsp--;
+                    if (failed) return retval;
+                    if ( backtracking==0 ) adaptor.addChild(root_0, expr49.getTree());
+
+                    }
+                    break;
+
             }
             retval.stop = input.LT(-1);
 
@@ -1896,36 +2095,36 @@
     };
 
     // $ANTLR start expr
-    // dd/grammar/ECAGrammar.g:101:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );
+    // dd/grammar/ECAGrammar.g:103:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );
     public final expr_return expr() throws RecognitionException {
         expr_return retval = new expr_return();
         retval.start = input.LT(1);
 
         Object root_0 = null;
 
-        Token TERN_IF50=null;
-        Token COLON51=null;
+        Token TERN_IF56=null;
+        Token COLON57=null;
         simple_expr_return cond = null;
 
         expr_return iftrue = null;
 
         expr_return iffalse = null;
 
-        simple_expr_return simple_expr44 = null;
+        simple_expr_return simple_expr50 = null;
 
-        infix_oper_return infix_oper45 = null;
+        infix_oper_return infix_oper51 = null;
 
-        expr_return expr46 = null;
+        expr_return expr52 = null;
 
-        simple_expr_return simple_expr47 = null;
+        simple_expr_return simple_expr53 = null;
 
-        unary_oper_return unary_oper48 = null;
+        unary_oper_return unary_oper54 = null;
 
-        expr_return expr49 = null;
+        expr_return expr55 = null;
 
 
-        Object TERN_IF50_tree=null;
-        Object COLON51_tree=null;
+        Object TERN_IF56_tree=null;
+        Object COLON57_tree=null;
         RewriteRuleTokenStream stream_COLON=new RewriteRuleTokenStream(adaptor,"token COLON");
         RewriteRuleTokenStream stream_TERN_IF=new RewriteRuleTokenStream(adaptor,"token TERN_IF");
         RewriteRuleSubtreeStream stream_unary_oper=new RewriteRuleSubtreeStream(adaptor,"rule unary_oper");
@@ -1933,29 +2132,12 @@
         RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
         RewriteRuleSubtreeStream stream_simple_expr=new RewriteRuleSubtreeStream(adaptor,"rule simple_expr");
         try {
-            // dd/grammar/ECAGrammar.g:101:6: ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) )
+            // dd/grammar/ECAGrammar.g:103:6: ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) )
             int alt7=4;
             switch ( input.LA(1) ) {
             case DOLLARSYM:
                 {
                 switch ( input.LA(2) ) {
-                case EOF:
-                case IF:
-                case DO:
-                case ENDRULE:
-                case RPAREN:
-                case RSQUARE:
-                case SEPR:
-                case COLON:
-                    {
-                    alt7=2;
-                    }
-                    break;
-                case TERN_IF:
-                    {
-                    alt7=4;
-                    }
-                    break;
                 case OR:
                 case AND:
                 case EQ:
@@ -1975,10 +2157,27 @@
                     alt7=1;
                     }
                     break;
+                case TERN_IF:
+                    {
+                    alt7=4;
+                    }
+                    break;
+                case EOF:
+                case IF:
+                case DO:
+                case ENDRULE:
+                case RPAREN:
+                case RSQUARE:
+                case SEPR:
+                case COLON:
+                    {
+                    alt7=2;
+                    }
+                    break;
                 default:
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("101:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 1, input);
+                        new NoViableAltException("103:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 1, input);
 
                     throw nvae;
                 }
@@ -1992,10 +2191,10 @@
                     {
                     int LA7_10 = input.LA(3);
 
-                    if ( (synpred9()) ) {
+                    if ( (synpred11()) ) {
                         alt7=1;
                     }
-                    else if ( (synpred10()) ) {
+                    else if ( (synpred12()) ) {
                         alt7=2;
                     }
                     else if ( (true) ) {
@@ -2004,20 +2203,25 @@
                     else {
                         if (backtracking>0) {failed=true; return retval;}
                         NoViableAltException nvae =
-                            new NoViableAltException("101:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 10, input);
+                            new NoViableAltException("103:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 10, input);
 
                         throw nvae;
                     }
                     }
                     break;
+                case TERN_IF:
+                    {
+                    alt7=4;
+                    }
+                    break;
                 case LSQUARE:
                     {
                     int LA7_11 = input.LA(3);
 
-                    if ( (synpred9()) ) {
+                    if ( (synpred11()) ) {
                         alt7=1;
                     }
-                    else if ( (synpred10()) ) {
+                    else if ( (synpred12()) ) {
                         alt7=2;
                     }
                     else if ( (true) ) {
@@ -2026,17 +2230,12 @@
                     else {
                         if (backtracking>0) {failed=true; return retval;}
                         NoViableAltException nvae =
-                            new NoViableAltException("101:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 11, input);
+                            new NoViableAltException("103:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 11, input);
 
                         throw nvae;
                     }
                     }
                     break;
-                case TERN_IF:
-                    {
-                    alt7=4;
-                    }
-                    break;
                 case EOF:
                 case IF:
                 case DO:
@@ -2071,7 +2270,7 @@
                 default:
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("101:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 2, input);
+                        new NoViableAltException("103:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 2, input);
 
                     throw nvae;
                 }
@@ -2081,6 +2280,23 @@
             case NUMBER:
                 {
                 switch ( input.LA(2) ) {
+                case TERN_IF:
+                    {
+                    alt7=4;
+                    }
+                    break;
+                case EOF:
+                case IF:
+                case DO:
+                case ENDRULE:
+                case RPAREN:
+                case RSQUARE:
+                case SEPR:
+                case COLON:
+                    {
+                    alt7=2;
+                    }
+                    break;
                 case OR:
                 case AND:
                 case EQ:
@@ -2100,27 +2316,10 @@
                     alt7=1;
                     }
                     break;
-                case EOF:
-                case IF:
-                case DO:
-                case ENDRULE:
-                case RPAREN:
-                case RSQUARE:
-                case SEPR:
-                case COLON:
-                    {
-                    alt7=2;
-                    }
-                    break;
-                case TERN_IF:
-                    {
-                    alt7=4;
-                    }
-                    break;
                 default:
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("101:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 3, input);
+                        new NoViableAltException("103:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 3, input);
 
                     throw nvae;
                 }
@@ -2130,18 +2329,6 @@
             case STRING:
                 {
                 switch ( input.LA(2) ) {
-                case EOF:
-                case IF:
-                case DO:
-                case ENDRULE:
-                case RPAREN:
-                case RSQUARE:
-                case SEPR:
-                case COLON:
-                    {
-                    alt7=2;
-                    }
-                    break;
                 case OR:
                 case AND:
                 case EQ:
@@ -2161,6 +2348,18 @@
                     alt7=1;
                     }
                     break;
+                case EOF:
+                case IF:
+                case DO:
+                case ENDRULE:
+                case RPAREN:
+                case RSQUARE:
+                case SEPR:
+                case COLON:
+                    {
+                    alt7=2;
+                    }
+                    break;
                 case TERN_IF:
                     {
                     alt7=4;
@@ -2169,7 +2368,7 @@
                 default:
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("101:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 4, input);
+                        new NoViableAltException("103:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 4, input);
 
                     throw nvae;
                 }
@@ -2180,10 +2379,10 @@
                 {
                 int LA7_5 = input.LA(2);
 
-                if ( (synpred9()) ) {
+                if ( (synpred11()) ) {
                     alt7=1;
                 }
-                else if ( (synpred10()) ) {
+                else if ( (synpred12()) ) {
                     alt7=2;
                 }
                 else if ( (true) ) {
@@ -2192,7 +2391,7 @@
                 else {
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("101:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 5, input);
+                        new NoViableAltException("103:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 5, input);
 
                     throw nvae;
                 }
@@ -2207,33 +2406,33 @@
             default:
                 if (backtracking>0) {failed=true; return retval;}
                 NoViableAltException nvae =
-                    new NoViableAltException("101:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 0, input);
+                    new NoViableAltException("103:1: expr : ( simple_expr infix_oper expr -> ^( BINOP infix_oper simple_expr expr ) | simple_expr | unary_oper expr -> ^( UNOP unary_oper expr ) | cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr -> ^( TERNOP $cond $iftrue $iffalse) );", 7, 0, input);
 
                 throw nvae;
             }
 
             switch (alt7) {
                 case 1 :
-                    // dd/grammar/ECAGrammar.g:101:8: simple_expr infix_oper expr
+                    // dd/grammar/ECAGrammar.g:103:8: simple_expr infix_oper expr
                     {
-                    pushFollow(FOLLOW_simple_expr_in_expr554);
-                    simple_expr44=simple_expr();
+                    pushFollow(FOLLOW_simple_expr_in_expr610);
+                    simple_expr50=simple_expr();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) stream_simple_expr.add(simple_expr44.getTree());
-                    pushFollow(FOLLOW_infix_oper_in_expr556);
-                    infix_oper45=infix_oper();
+                    if ( backtracking==0 ) stream_simple_expr.add(simple_expr50.getTree());
+                    pushFollow(FOLLOW_infix_oper_in_expr612);
+                    infix_oper51=infix_oper();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) stream_infix_oper.add(infix_oper45.getTree());
-                    pushFollow(FOLLOW_expr_in_expr558);
-                    expr46=expr();
+                    if ( backtracking==0 ) stream_infix_oper.add(infix_oper51.getTree());
+                    pushFollow(FOLLOW_expr_in_expr614);
+                    expr52=expr();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) stream_expr.add(expr46.getTree());
+                    if ( backtracking==0 ) stream_expr.add(expr52.getTree());
 
                     // AST REWRITE
-                    // elements: expr, infix_oper, simple_expr
+                    // elements: expr, simple_expr, infix_oper
                     // token labels: 
                     // rule labels: retval
                     // token list labels: 
@@ -2243,9 +2442,9 @@
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
 
                     root_0 = (Object)adaptor.nil();
-                    // 101:37: -> ^( BINOP infix_oper simple_expr expr )
+                    // 103:37: -> ^( BINOP infix_oper simple_expr expr )
                     {
-                        // dd/grammar/ECAGrammar.g:101:40: ^( BINOP infix_oper simple_expr expr )
+                        // dd/grammar/ECAGrammar.g:103:40: ^( BINOP infix_oper simple_expr expr )
                         {
                         Object root_1 = (Object)adaptor.nil();
                         root_1 = (Object)adaptor.becomeRoot(adaptor.create(BINOP, "BINOP"), root_1);
@@ -2264,34 +2463,34 @@
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAGrammar.g:102:4: simple_expr
+                    // dd/grammar/ECAGrammar.g:104:4: simple_expr
                     {
                     root_0 = (Object)adaptor.nil();
 
-                    pushFollow(FOLLOW_simple_expr_in_expr576);
-                    simple_expr47=simple_expr();
+                    pushFollow(FOLLOW_simple_expr_in_expr632);
+                    simple_expr53=simple_expr();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) adaptor.addChild(root_0, simple_expr47.getTree());
+                    if ( backtracking==0 ) adaptor.addChild(root_0, simple_expr53.getTree());
 
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAGrammar.g:103:4: unary_oper expr
+                    // dd/grammar/ECAGrammar.g:105:4: unary_oper expr
                     {
-                    pushFollow(FOLLOW_unary_oper_in_expr581);
-                    unary_oper48=unary_oper();
+                    pushFollow(FOLLOW_unary_oper_in_expr637);
+                    unary_oper54=unary_oper();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) stream_unary_oper.add(unary_oper48.getTree());
-                    pushFollow(FOLLOW_expr_in_expr583);
-                    expr49=expr();
+                    if ( backtracking==0 ) stream_unary_oper.add(unary_oper54.getTree());
+                    pushFollow(FOLLOW_expr_in_expr639);
+                    expr55=expr();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) stream_expr.add(expr49.getTree());
+                    if ( backtracking==0 ) stream_expr.add(expr55.getTree());
 
                     // AST REWRITE
-                    // elements: unary_oper, expr
+                    // elements: expr, unary_oper
                     // token labels: 
                     // rule labels: retval
                     // token list labels: 
@@ -2301,9 +2500,9 @@
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
 
                     root_0 = (Object)adaptor.nil();
-                    // 103:22: -> ^( UNOP unary_oper expr )
+                    // 105:22: -> ^( UNOP unary_oper expr )
                     {
-                        // dd/grammar/ECAGrammar.g:103:25: ^( UNOP unary_oper expr )
+                        // dd/grammar/ECAGrammar.g:105:25: ^( UNOP unary_oper expr )
                         {
                         Object root_1 = (Object)adaptor.nil();
                         root_1 = (Object)adaptor.becomeRoot(adaptor.create(UNOP, "UNOP"), root_1);
@@ -2321,34 +2520,34 @@
                     }
                     break;
                 case 4 :
-                    // dd/grammar/ECAGrammar.g:104:4: cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr
+                    // dd/grammar/ECAGrammar.g:106:4: cond= simple_expr TERN_IF iftrue= expr COLON iffalse= expr
                     {
-                    pushFollow(FOLLOW_simple_expr_in_expr602);
+                    pushFollow(FOLLOW_simple_expr_in_expr658);
                     cond=simple_expr();
                     _fsp--;
                     if (failed) return retval;
                     if ( backtracking==0 ) stream_simple_expr.add(cond.getTree());
-                    TERN_IF50=(Token)input.LT(1);
-                    match(input,TERN_IF,FOLLOW_TERN_IF_in_expr604); if (failed) return retval;
-                    if ( backtracking==0 ) stream_TERN_IF.add(TERN_IF50);
+                    TERN_IF56=(Token)input.LT(1);
+                    match(input,TERN_IF,FOLLOW_TERN_IF_in_expr660); if (failed) return retval;
+                    if ( backtracking==0 ) stream_TERN_IF.add(TERN_IF56);
 
-                    pushFollow(FOLLOW_expr_in_expr608);
+                    pushFollow(FOLLOW_expr_in_expr664);
                     iftrue=expr();
                     _fsp--;
                     if (failed) return retval;
                     if ( backtracking==0 ) stream_expr.add(iftrue.getTree());
-                    COLON51=(Token)input.LT(1);
-                    match(input,COLON,FOLLOW_COLON_in_expr610); if (failed) return retval;
-                    if ( backtracking==0 ) stream_COLON.add(COLON51);
+                    COLON57=(Token)input.LT(1);
+                    match(input,COLON,FOLLOW_COLON_in_expr666); if (failed) return retval;
+                    if ( backtracking==0 ) stream_COLON.add(COLON57);
 
-                    pushFollow(FOLLOW_expr_in_expr614);
+                    pushFollow(FOLLOW_expr_in_expr670);
                     iffalse=expr();
                     _fsp--;
                     if (failed) return retval;
                     if ( backtracking==0 ) stream_expr.add(iffalse.getTree());
 
                     // AST REWRITE
-                    // elements: iffalse, cond, iftrue
+                    // elements: iffalse, iftrue, cond
                     // token labels: 
                     // rule labels: iftrue, cond, iffalse, retval
                     // token list labels: 
@@ -2361,9 +2560,9 @@
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
 
                     root_0 = (Object)adaptor.nil();
-                    // 104:60: -> ^( TERNOP $cond $iftrue $iffalse)
+                    // 106:60: -> ^( TERNOP $cond $iftrue $iffalse)
                     {
-                        // dd/grammar/ECAGrammar.g:104:63: ^( TERNOP $cond $iftrue $iffalse)
+                        // dd/grammar/ECAGrammar.g:106:63: ^( TERNOP $cond $iftrue $iffalse)
                         {
                         Object root_1 = (Object)adaptor.nil();
                         root_1 = (Object)adaptor.becomeRoot(adaptor.create(TERNOP, "TERNOP"), root_1);
@@ -2406,7 +2605,7 @@
     };
 
     // $ANTLR start simple_expr
-    // dd/grammar/ECAGrammar.g:107:1: simple_expr : (v= DOLLARSYM | v= SYMBOL idx= array_idx -> ^( ARRAY $v $idx) | v= SYMBOL LPAREN RPAREN -> ^( METH $v) | v= SYMBOL | v= SYMBOL LPAREN args= expr_list RPAREN -> ^( METH $v $args) | NUMBER | STRING | LPAREN expr RPAREN -> ^( expr ) );
+    // dd/grammar/ECAGrammar.g:109:1: simple_expr : (v= DOLLARSYM | v= SYMBOL idx= array_idx -> ^( ARRAY $v $idx) | v= SYMBOL LPAREN RPAREN -> ^( METH $v) | v= SYMBOL | v= SYMBOL LPAREN args= expr_list RPAREN -> ^( METH $v $args) | NUMBER | STRING | LPAREN expr RPAREN -> ^( expr ) );
     public final simple_expr_return simple_expr() throws RecognitionException {
         simple_expr_return retval = new simple_expr_return();
         retval.start = input.LT(1);
@@ -2414,30 +2613,30 @@
         Object root_0 = null;
 
         Token v=null;
-        Token LPAREN52=null;
-        Token RPAREN53=null;
-        Token LPAREN54=null;
-        Token RPAREN55=null;
-        Token NUMBER56=null;
-        Token STRING57=null;
         Token LPAREN58=null;
-        Token RPAREN60=null;
+        Token RPAREN59=null;
+        Token LPAREN60=null;
+        Token RPAREN61=null;
+        Token NUMBER62=null;
+        Token STRING63=null;
+        Token LPAREN64=null;
+        Token RPAREN66=null;
         array_idx_return idx = null;
 
         expr_list_return args = null;
 
-        expr_return expr59 = null;
+        expr_return expr65 = null;
 
 
         Object v_tree=null;
-        Object LPAREN52_tree=null;
-        Object RPAREN53_tree=null;
-        Object LPAREN54_tree=null;
-        Object RPAREN55_tree=null;
-        Object NUMBER56_tree=null;
-        Object STRING57_tree=null;
         Object LPAREN58_tree=null;
-        Object RPAREN60_tree=null;
+        Object RPAREN59_tree=null;
+        Object LPAREN60_tree=null;
+        Object RPAREN61_tree=null;
+        Object NUMBER62_tree=null;
+        Object STRING63_tree=null;
+        Object LPAREN64_tree=null;
+        Object RPAREN66_tree=null;
         RewriteRuleTokenStream stream_RPAREN=new RewriteRuleTokenStream(adaptor,"token RPAREN");
         RewriteRuleTokenStream stream_LPAREN=new RewriteRuleTokenStream(adaptor,"token LPAREN");
         RewriteRuleTokenStream stream_SYMBOL=new RewriteRuleTokenStream(adaptor,"token SYMBOL");
@@ -2445,7 +2644,7 @@
         RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
         RewriteRuleSubtreeStream stream_array_idx=new RewriteRuleSubtreeStream(adaptor,"rule array_idx");
         try {
-            // dd/grammar/ECAGrammar.g:107:13: (v= DOLLARSYM | v= SYMBOL idx= array_idx -> ^( ARRAY $v $idx) | v= SYMBOL LPAREN RPAREN -> ^( METH $v) | v= SYMBOL | v= SYMBOL LPAREN args= expr_list RPAREN -> ^( METH $v $args) | NUMBER | STRING | LPAREN expr RPAREN -> ^( expr ) )
+            // dd/grammar/ECAGrammar.g:109:13: (v= DOLLARSYM | v= SYMBOL idx= array_idx -> ^( ARRAY $v $idx) | v= SYMBOL LPAREN RPAREN -> ^( METH $v) | v= SYMBOL | v= SYMBOL LPAREN args= expr_list RPAREN -> ^( METH $v $args) | NUMBER | STRING | LPAREN expr RPAREN -> ^( expr ) )
             int alt8=8;
             switch ( input.LA(1) ) {
             case DOLLARSYM:
@@ -2469,12 +2668,17 @@
                     else {
                         if (backtracking>0) {failed=true; return retval;}
                         NoViableAltException nvae =
-                            new NoViableAltException("107:1: simple_expr : (v= DOLLARSYM | v= SYMBOL idx= array_idx -> ^( ARRAY $v $idx) | v= SYMBOL LPAREN RPAREN -> ^( METH $v) | v= SYMBOL | v= SYMBOL LPAREN args= expr_list RPAREN -> ^( METH $v $args) | NUMBER | STRING | LPAREN expr RPAREN -> ^( expr ) );", 8, 6, input);
+                            new NoViableAltException("109:1: simple_expr : (v= DOLLARSYM | v= SYMBOL idx= array_idx -> ^( ARRAY $v $idx) | v= SYMBOL LPAREN RPAREN -> ^( METH $v) | v= SYMBOL | v= SYMBOL LPAREN args= expr_list RPAREN -> ^( METH $v $args) | NUMBER | STRING | LPAREN expr RPAREN -> ^( expr ) );", 8, 6, input);
 
                         throw nvae;
                     }
                     }
                     break;
+                case LSQUARE:
+                    {
+                    alt8=2;
+                    }
+                    break;
                 case EOF:
                 case IF:
                 case DO:
@@ -2503,15 +2707,10 @@
                     alt8=4;
                     }
                     break;
-                case LSQUARE:
-                    {
-                    alt8=2;
-                    }
-                    break;
                 default:
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("107:1: simple_expr : (v= DOLLARSYM | v= SYMBOL idx= array_idx -> ^( ARRAY $v $idx) | v= SYMBOL LPAREN RPAREN -> ^( METH $v) | v= SYMBOL | v= SYMBOL LPAREN args= expr_list RPAREN -> ^( METH $v $args) | NUMBER | STRING | LPAREN expr RPAREN -> ^( expr ) );", 8, 2, input);
+                        new NoViableAltException("109:1: simple_expr : (v= DOLLARSYM | v= SYMBOL idx= array_idx -> ^( ARRAY $v $idx) | v= SYMBOL LPAREN RPAREN -> ^( METH $v) | v= SYMBOL | v= SYMBOL LPAREN args= expr_list RPAREN -> ^( METH $v $args) | NUMBER | STRING | LPAREN expr RPAREN -> ^( expr ) );", 8, 2, input);
 
                     throw nvae;
                 }
@@ -2536,19 +2735,19 @@
             default:
                 if (backtracking>0) {failed=true; return retval;}
                 NoViableAltException nvae =
-                    new NoViableAltException("107:1: simple_expr : (v= DOLLARSYM | v= SYMBOL idx= array_idx -> ^( ARRAY $v $idx) | v= SYMBOL LPAREN RPAREN -> ^( METH $v) | v= SYMBOL | v= SYMBOL LPAREN args= expr_list RPAREN -> ^( METH $v $args) | NUMBER | STRING | LPAREN expr RPAREN -> ^( expr ) );", 8, 0, input);
+                    new NoViableAltException("109:1: simple_expr : (v= DOLLARSYM | v= SYMBOL idx= array_idx -> ^( ARRAY $v $idx) | v= SYMBOL LPAREN RPAREN -> ^( METH $v) | v= SYMBOL | v= SYMBOL LPAREN args= expr_list RPAREN -> ^( METH $v $args) | NUMBER | STRING | LPAREN expr RPAREN -> ^( expr ) );", 8, 0, input);
 
                 throw nvae;
             }
 
             switch (alt8) {
                 case 1 :
-                    // dd/grammar/ECAGrammar.g:107:15: v= DOLLARSYM
+                    // dd/grammar/ECAGrammar.g:109:15: v= DOLLARSYM
                     {
                     root_0 = (Object)adaptor.nil();
 
                     v=(Token)input.LT(1);
-                    match(input,DOLLARSYM,FOLLOW_DOLLARSYM_in_simple_expr641); if (failed) return retval;
+                    match(input,DOLLARSYM,FOLLOW_DOLLARSYM_in_simple_expr697); if (failed) return retval;
                     if ( backtracking==0 ) {
                     v_tree = (Object)adaptor.create(v);
                     adaptor.addChild(root_0, v_tree);
@@ -2557,20 +2756,20 @@
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAGrammar.g:108:4: v= SYMBOL idx= array_idx
+                    // dd/grammar/ECAGrammar.g:110:4: v= SYMBOL idx= array_idx
                     {
                     v=(Token)input.LT(1);
-                    match(input,SYMBOL,FOLLOW_SYMBOL_in_simple_expr648); if (failed) return retval;
+                    match(input,SYMBOL,FOLLOW_SYMBOL_in_simple_expr704); if (failed) return retval;
                     if ( backtracking==0 ) stream_SYMBOL.add(v);
 
-                    pushFollow(FOLLOW_array_idx_in_simple_expr652);
+                    pushFollow(FOLLOW_array_idx_in_simple_expr708);
                     idx=array_idx();
                     _fsp--;
                     if (failed) return retval;
                     if ( backtracking==0 ) stream_array_idx.add(idx.getTree());
 
                     // AST REWRITE
-                    // elements: idx, v
+                    // elements: v, idx
                     // token labels: v
                     // rule labels: idx, retval
                     // token list labels: 
@@ -2582,9 +2781,9 @@
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
 
                     root_0 = (Object)adaptor.nil();
-                    // 108:29: -> ^( ARRAY $v $idx)
+                    // 110:29: -> ^( ARRAY $v $idx)
                     {
-                        // dd/grammar/ECAGrammar.g:108:32: ^( ARRAY $v $idx)
+                        // dd/grammar/ECAGrammar.g:110:32: ^( ARRAY $v $idx)
                         {
                         Object root_1 = (Object)adaptor.nil();
                         root_1 = (Object)adaptor.becomeRoot(adaptor.create(ARRAY, "ARRAY"), root_1);
@@ -2602,19 +2801,19 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAGrammar.g:109:4: v= SYMBOL LPAREN RPAREN
+                    // dd/grammar/ECAGrammar.g:111:4: v= SYMBOL LPAREN RPAREN
                     {
                     v=(Token)input.LT(1);
-                    match(input,SYMBOL,FOLLOW_SYMBOL_in_simple_expr673); if (failed) return retval;
+                    match(input,SYMBOL,FOLLOW_SYMBOL_in_simple_expr729); if (failed) return retval;
                     if ( backtracking==0 ) stream_SYMBOL.add(v);
 
-                    LPAREN52=(Token)input.LT(1);
-                    match(input,LPAREN,FOLLOW_LPAREN_in_simple_expr675); if (failed) return retval;
-                    if ( backtracking==0 ) stream_LPAREN.add(LPAREN52);
+                    LPAREN58=(Token)input.LT(1);
+                    match(input,LPAREN,FOLLOW_LPAREN_in_simple_expr731); if (failed) return retval;
+                    if ( backtracking==0 ) stream_LPAREN.add(LPAREN58);
 
-                    RPAREN53=(Token)input.LT(1);
-                    match(input,RPAREN,FOLLOW_RPAREN_in_simple_expr677); if (failed) return retval;
-                    if ( backtracking==0 ) stream_RPAREN.add(RPAREN53);
+                    RPAREN59=(Token)input.LT(1);
+                    match(input,RPAREN,FOLLOW_RPAREN_in_simple_expr733); if (failed) return retval;
+                    if ( backtracking==0 ) stream_RPAREN.add(RPAREN59);
 
 
                     // AST REWRITE
@@ -2629,9 +2828,9 @@
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
 
                     root_0 = (Object)adaptor.nil();
-                    // 109:29: -> ^( METH $v)
+                    // 111:29: -> ^( METH $v)
                     {
-                        // dd/grammar/ECAGrammar.g:109:32: ^( METH $v)
+                        // dd/grammar/ECAGrammar.g:111:32: ^( METH $v)
                         {
                         Object root_1 = (Object)adaptor.nil();
                         root_1 = (Object)adaptor.becomeRoot(adaptor.create(METH, "METH"), root_1);
@@ -2648,12 +2847,12 @@
                     }
                     break;
                 case 4 :
-                    // dd/grammar/ECAGrammar.g:110:4: v= SYMBOL
+                    // dd/grammar/ECAGrammar.g:112:4: v= SYMBOL
                     {
                     root_0 = (Object)adaptor.nil();
 
                     v=(Token)input.LT(1);
-                    match(input,SYMBOL,FOLLOW_SYMBOL_in_simple_expr695); if (failed) return retval;
+                    match(input,SYMBOL,FOLLOW_SYMBOL_in_simple_expr751); if (failed) return retval;
                     if ( backtracking==0 ) {
                     v_tree = (Object)adaptor.create(v);
                     adaptor.addChild(root_0, v_tree);
@@ -2662,24 +2861,24 @@
                     }
                     break;
                 case 5 :
-                    // dd/grammar/ECAGrammar.g:111:4: v= SYMBOL LPAREN args= expr_list RPAREN
+                    // dd/grammar/ECAGrammar.g:113:4: v= SYMBOL LPAREN args= expr_list RPAREN
                     {
                     v=(Token)input.LT(1);
-                    match(input,SYMBOL,FOLLOW_SYMBOL_in_simple_expr702); if (failed) return retval;
+                    match(input,SYMBOL,FOLLOW_SYMBOL_in_simple_expr758); if (failed) return retval;
                     if ( backtracking==0 ) stream_SYMBOL.add(v);
 
-                    LPAREN54=(Token)input.LT(1);
-                    match(input,LPAREN,FOLLOW_LPAREN_in_simple_expr704); if (failed) return retval;
-                    if ( backtracking==0 ) stream_LPAREN.add(LPAREN54);
+                    LPAREN60=(Token)input.LT(1);
+                    match(input,LPAREN,FOLLOW_LPAREN_in_simple_expr760); if (failed) return retval;
+                    if ( backtracking==0 ) stream_LPAREN.add(LPAREN60);
 
-                    pushFollow(FOLLOW_expr_list_in_simple_expr708);
+                    pushFollow(FOLLOW_expr_list_in_simple_expr764);
                     args=expr_list();
                     _fsp--;
                     if (failed) return retval;
                     if ( backtracking==0 ) stream_expr_list.add(args.getTree());
-                    RPAREN55=(Token)input.LT(1);
-                    match(input,RPAREN,FOLLOW_RPAREN_in_simple_expr710); if (failed) return retval;
-                    if ( backtracking==0 ) stream_RPAREN.add(RPAREN55);
+                    RPAREN61=(Token)input.LT(1);
+                    match(input,RPAREN,FOLLOW_RPAREN_in_simple_expr766); if (failed) return retval;
+                    if ( backtracking==0 ) stream_RPAREN.add(RPAREN61);
 
 
                     // AST REWRITE
@@ -2695,9 +2894,9 @@
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
 
                     root_0 = (Object)adaptor.nil();
-                    // 111:43: -> ^( METH $v $args)
+                    // 113:43: -> ^( METH $v $args)
                     {
-                        // dd/grammar/ECAGrammar.g:111:46: ^( METH $v $args)
+                        // dd/grammar/ECAGrammar.g:113:46: ^( METH $v $args)
                         {
                         Object root_1 = (Object)adaptor.nil();
                         root_1 = (Object)adaptor.becomeRoot(adaptor.create(METH, "METH"), root_1);
@@ -2715,48 +2914,48 @@
                     }
                     break;
                 case 6 :
-                    // dd/grammar/ECAGrammar.g:112:4: NUMBER
+                    // dd/grammar/ECAGrammar.g:114:4: NUMBER
                     {
                     root_0 = (Object)adaptor.nil();
 
-                    NUMBER56=(Token)input.LT(1);
-                    match(input,NUMBER,FOLLOW_NUMBER_in_simple_expr729); if (failed) return retval;
+                    NUMBER62=(Token)input.LT(1);
+                    match(input,NUMBER,FOLLOW_NUMBER_in_simple_expr785); if (failed) return retval;
                     if ( backtracking==0 ) {
-                    NUMBER56_tree = (Object)adaptor.create(NUMBER56);
-                    adaptor.addChild(root_0, NUMBER56_tree);
+                    NUMBER62_tree = (Object)adaptor.create(NUMBER62);
+                    adaptor.addChild(root_0, NUMBER62_tree);
                     }
 
                     }
                     break;
                 case 7 :
-                    // dd/grammar/ECAGrammar.g:113:4: STRING
+                    // dd/grammar/ECAGrammar.g:115:4: STRING
                     {
                     root_0 = (Object)adaptor.nil();
 
-                    STRING57=(Token)input.LT(1);
-                    match(input,STRING,FOLLOW_STRING_in_simple_expr734); if (failed) return retval;
+                    STRING63=(Token)input.LT(1);
+                    match(input,STRING,FOLLOW_STRING_in_simple_expr790); if (failed) return retval;
                     if ( backtracking==0 ) {
-                    STRING57_tree = (Object)adaptor.create(STRING57);
-                    adaptor.addChild(root_0, STRING57_tree);
+                    STRING63_tree = (Object)adaptor.create(STRING63);
+                    adaptor.addChild(root_0, STRING63_tree);
                     }
 
                     }
                     break;
                 case 8 :
-                    // dd/grammar/ECAGrammar.g:114:4: LPAREN expr RPAREN
+                    // dd/grammar/ECAGrammar.g:116:4: LPAREN expr RPAREN
                     {
-                    LPAREN58=(Token)input.LT(1);
-                    match(input,LPAREN,FOLLOW_LPAREN_in_simple_expr739); if (failed) return retval;
-                    if ( backtracking==0 ) stream_LPAREN.add(LPAREN58);
+                    LPAREN64=(Token)input.LT(1);
+                    match(input,LPAREN,FOLLOW_LPAREN_in_simple_expr795); if (failed) return retval;
+                    if ( backtracking==0 ) stream_LPAREN.add(LPAREN64);
 
-                    pushFollow(FOLLOW_expr_in_simple_expr741);
-                    expr59=expr();
+                    pushFollow(FOLLOW_expr_in_simple_expr797);
+                    expr65=expr();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) stream_expr.add(expr59.getTree());
-                    RPAREN60=(Token)input.LT(1);
-                    match(input,RPAREN,FOLLOW_RPAREN_in_simple_expr743); if (failed) return retval;
-                    if ( backtracking==0 ) stream_RPAREN.add(RPAREN60);
+                    if ( backtracking==0 ) stream_expr.add(expr65.getTree());
+                    RPAREN66=(Token)input.LT(1);
+                    match(input,RPAREN,FOLLOW_RPAREN_in_simple_expr799); if (failed) return retval;
+                    if ( backtracking==0 ) stream_RPAREN.add(RPAREN66);
 
 
                     // AST REWRITE
@@ -2770,9 +2969,9 @@
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
 
                     root_0 = (Object)adaptor.nil();
-                    // 114:25: -> ^( expr )
+                    // 116:25: -> ^( expr )
                     {
-                        // dd/grammar/ECAGrammar.g:114:28: ^( expr )
+                        // dd/grammar/ECAGrammar.g:116:28: ^( expr )
                         {
                         Object root_1 = (Object)adaptor.nil();
                         root_1 = (Object)adaptor.becomeRoot(stream_expr.nextNode(), root_1);
@@ -2811,34 +3010,34 @@
     };
 
     // $ANTLR start expr_list
-    // dd/grammar/ECAGrammar.g:117:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );
+    // dd/grammar/ECAGrammar.g:119:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );
     public final expr_list_return expr_list() throws RecognitionException {
         expr_list_return retval = new expr_list_return();
         retval.start = input.LT(1);
 
         Object root_0 = null;
 
-        Token SEPR62=null;
-        expr_return expr61 = null;
+        Token SEPR68=null;
+        expr_return expr67 = null;
 
-        expr_list_return expr_list63 = null;
+        expr_list_return expr_list69 = null;
 
-        expr_return expr64 = null;
+        expr_return expr70 = null;
 
 
-        Object SEPR62_tree=null;
+        Object SEPR68_tree=null;
         RewriteRuleTokenStream stream_SEPR=new RewriteRuleTokenStream(adaptor,"token SEPR");
         RewriteRuleSubtreeStream stream_expr_list=new RewriteRuleSubtreeStream(adaptor,"rule expr_list");
         RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
         try {
-            // dd/grammar/ECAGrammar.g:118:2: ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr )
+            // dd/grammar/ECAGrammar.g:120:2: ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr )
             int alt9=2;
             switch ( input.LA(1) ) {
             case DOLLARSYM:
                 {
                 int LA9_1 = input.LA(2);
 
-                if ( (synpred19()) ) {
+                if ( (synpred21()) ) {
                     alt9=1;
                 }
                 else if ( (true) ) {
@@ -2847,7 +3046,7 @@
                 else {
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("117:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 1, input);
+                        new NoViableAltException("119:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 1, input);
 
                     throw nvae;
                 }
@@ -2857,7 +3056,7 @@
                 {
                 int LA9_2 = input.LA(2);
 
-                if ( (synpred19()) ) {
+                if ( (synpred21()) ) {
                     alt9=1;
                 }
                 else if ( (true) ) {
@@ -2866,7 +3065,7 @@
                 else {
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("117:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 2, input);
+                        new NoViableAltException("119:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 2, input);
 
                     throw nvae;
                 }
@@ -2876,7 +3075,7 @@
                 {
                 int LA9_3 = input.LA(2);
 
-                if ( (synpred19()) ) {
+                if ( (synpred21()) ) {
                     alt9=1;
                 }
                 else if ( (true) ) {
@@ -2885,7 +3084,7 @@
                 else {
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("117:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 3, input);
+                        new NoViableAltException("119:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 3, input);
 
                     throw nvae;
                 }
@@ -2895,7 +3094,7 @@
                 {
                 int LA9_4 = input.LA(2);
 
-                if ( (synpred19()) ) {
+                if ( (synpred21()) ) {
                     alt9=1;
                 }
                 else if ( (true) ) {
@@ -2904,7 +3103,7 @@
                 else {
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("117:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 4, input);
+                        new NoViableAltException("119:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 4, input);
 
                     throw nvae;
                 }
@@ -2914,7 +3113,7 @@
                 {
                 int LA9_5 = input.LA(2);
 
-                if ( (synpred19()) ) {
+                if ( (synpred21()) ) {
                     alt9=1;
                 }
                 else if ( (true) ) {
@@ -2923,7 +3122,7 @@
                 else {
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("117:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 5, input);
+                        new NoViableAltException("119:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 5, input);
 
                     throw nvae;
                 }
@@ -2934,7 +3133,7 @@
                 {
                 int LA9_6 = input.LA(2);
 
-                if ( (synpred19()) ) {
+                if ( (synpred21()) ) {
                     alt9=1;
                 }
                 else if ( (true) ) {
@@ -2943,7 +3142,7 @@
                 else {
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("117:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 6, input);
+                        new NoViableAltException("119:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 6, input);
 
                     throw nvae;
                 }
@@ -2952,32 +3151,32 @@
             default:
                 if (backtracking>0) {failed=true; return retval;}
                 NoViableAltException nvae =
-                    new NoViableAltException("117:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 0, input);
+                    new NoViableAltException("119:1: expr_list : ( expr SEPR expr_list -> ^( SEPR expr expr_list ) | expr );", 9, 0, input);
 
                 throw nvae;
             }
 
             switch (alt9) {
                 case 1 :
-                    // dd/grammar/ECAGrammar.g:118:4: expr SEPR expr_list
+                    // dd/grammar/ECAGrammar.g:120:4: expr SEPR expr_list
                     {
-                    pushFollow(FOLLOW_expr_in_expr_list762);
-                    expr61=expr();
+                    pushFollow(FOLLOW_expr_in_expr_list818);
+                    expr67=expr();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) stream_expr.add(expr61.getTree());
-                    SEPR62=(Token)input.LT(1);
-                    match(input,SEPR,FOLLOW_SEPR_in_expr_list764); if (failed) return retval;
-                    if ( backtracking==0 ) stream_SEPR.add(SEPR62);
+                    if ( backtracking==0 ) stream_expr.add(expr67.getTree());
+                    SEPR68=(Token)input.LT(1);
+                    match(input,SEPR,FOLLOW_SEPR_in_expr_list820); if (failed) return retval;
+                    if ( backtracking==0 ) stream_SEPR.add(SEPR68);
 
-                    pushFollow(FOLLOW_expr_list_in_expr_list766);
-                    expr_list63=expr_list();
+                    pushFollow(FOLLOW_expr_list_in_expr_list822);
+                    expr_list69=expr_list();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) stream_expr_list.add(expr_list63.getTree());
+                    if ( backtracking==0 ) stream_expr_list.add(expr_list69.getTree());
 
                     // AST REWRITE
-                    // elements: expr_list, expr, SEPR
+                    // elements: expr_list, SEPR, expr
                     // token labels: 
                     // rule labels: retval
                     // token list labels: 
@@ -2987,9 +3186,9 @@
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
 
                     root_0 = (Object)adaptor.nil();
-                    // 118:26: -> ^( SEPR expr expr_list )
+                    // 120:26: -> ^( SEPR expr expr_list )
                     {
-                        // dd/grammar/ECAGrammar.g:118:29: ^( SEPR expr expr_list )
+                        // dd/grammar/ECAGrammar.g:120:29: ^( SEPR expr expr_list )
                         {
                         Object root_1 = (Object)adaptor.nil();
                         root_1 = (Object)adaptor.becomeRoot(stream_SEPR.next(), root_1);
@@ -3007,15 +3206,15 @@
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAGrammar.g:119:4: expr
+                    // dd/grammar/ECAGrammar.g:121:4: expr
                     {
                     root_0 = (Object)adaptor.nil();
 
-                    pushFollow(FOLLOW_expr_in_expr_list783);
-                    expr64=expr();
+                    pushFollow(FOLLOW_expr_in_expr_list839);
+                    expr70=expr();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) adaptor.addChild(root_0, expr64.getTree());
+                    if ( backtracking==0 ) adaptor.addChild(root_0, expr70.getTree());
 
                     }
                     break;
@@ -3044,31 +3243,31 @@
     };
 
     // $ANTLR start array_idx_list
-    // dd/grammar/ECAGrammar.g:122:1: array_idx_list : ( array_idx array_idx_list -> ^( SEPR array_idx array_idx_list ) | array_idx );
+    // dd/grammar/ECAGrammar.g:124:1: array_idx_list : ( array_idx array_idx_list -> ^( SEPR array_idx array_idx_list ) | array_idx );
     public final array_idx_list_return array_idx_list() throws RecognitionException {
         array_idx_list_return retval = new array_idx_list_return();
         retval.start = input.LT(1);
 
         Object root_0 = null;
 
-        array_idx_return array_idx65 = null;
+        array_idx_return array_idx71 = null;
 
-        array_idx_list_return array_idx_list66 = null;
+        array_idx_list_return array_idx_list72 = null;
 
-        array_idx_return array_idx67 = null;
+        array_idx_return array_idx73 = null;
 
 
         RewriteRuleSubtreeStream stream_array_idx=new RewriteRuleSubtreeStream(adaptor,"rule array_idx");
         RewriteRuleSubtreeStream stream_array_idx_list=new RewriteRuleSubtreeStream(adaptor,"rule array_idx_list");
         try {
-            // dd/grammar/ECAGrammar.g:123:2: ( array_idx array_idx_list -> ^( SEPR array_idx array_idx_list ) | array_idx )
+            // dd/grammar/ECAGrammar.g:125:2: ( array_idx array_idx_list -> ^( SEPR array_idx array_idx_list ) | array_idx )
             int alt10=2;
             int LA10_0 = input.LA(1);
 
             if ( (LA10_0==LSQUARE) ) {
                 int LA10_1 = input.LA(2);
 
-                if ( (synpred20()) ) {
+                if ( (synpred22()) ) {
                     alt10=1;
                 }
                 else if ( (true) ) {
@@ -3077,7 +3276,7 @@
                 else {
                     if (backtracking>0) {failed=true; return retval;}
                     NoViableAltException nvae =
-                        new NoViableAltException("122:1: array_idx_list : ( array_idx array_idx_list -> ^( SEPR array_idx array_idx_list ) | array_idx );", 10, 1, input);
+                        new NoViableAltException("124:1: array_idx_list : ( array_idx array_idx_list -> ^( SEPR array_idx array_idx_list ) | array_idx );", 10, 1, input);
 
                     throw nvae;
                 }
@@ -3085,27 +3284,27 @@
             else {
                 if (backtracking>0) {failed=true; return retval;}
                 NoViableAltException nvae =
-                    new NoViableAltException("122:1: array_idx_list : ( array_idx array_idx_list -> ^( SEPR array_idx array_idx_list ) | array_idx );", 10, 0, input);
+                    new NoViableAltException("124:1: array_idx_list : ( array_idx array_idx_list -> ^( SEPR array_idx array_idx_list ) | array_idx );", 10, 0, input);
 
                 throw nvae;
             }
             switch (alt10) {
                 case 1 :
-                    // dd/grammar/ECAGrammar.g:123:4: array_idx array_idx_list
+                    // dd/grammar/ECAGrammar.g:125:4: array_idx array_idx_list
                     {
-                    pushFollow(FOLLOW_array_idx_in_array_idx_list794);
-                    array_idx65=array_idx();
+                    pushFollow(FOLLOW_array_idx_in_array_idx_list850);
+                    array_idx71=array_idx();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) stream_array_idx.add(array_idx65.getTree());
-                    pushFollow(FOLLOW_array_idx_list_in_array_idx_list796);
-                    array_idx_list66=array_idx_list();
+                    if ( backtracking==0 ) stream_array_idx.add(array_idx71.getTree());
+                    pushFollow(FOLLOW_array_idx_list_in_array_idx_list852);
+                    array_idx_list72=array_idx_list();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) stream_array_idx_list.add(array_idx_list66.getTree());
+                    if ( backtracking==0 ) stream_array_idx_list.add(array_idx_list72.getTree());
 
                     // AST REWRITE
-                    // elements: array_idx, array_idx_list
+                    // elements: array_idx_list, array_idx
                     // token labels: 
                     // rule labels: retval
                     // token list labels: 
@@ -3115,9 +3314,9 @@
                     RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
 
                     root_0 = (Object)adaptor.nil();
-                    // 123:31: -> ^( SEPR array_idx array_idx_list )
+                    // 125:31: -> ^( SEPR array_idx array_idx_list )
                     {
-                        // dd/grammar/ECAGrammar.g:123:34: ^( SEPR array_idx array_idx_list )
+                        // dd/grammar/ECAGrammar.g:125:34: ^( SEPR array_idx array_idx_list )
                         {
                         Object root_1 = (Object)adaptor.nil();
                         root_1 = (Object)adaptor.becomeRoot(adaptor.create(SEPR, "SEPR"), root_1);
@@ -3135,15 +3334,15 @@
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAGrammar.g:124:4: array_idx
+                    // dd/grammar/ECAGrammar.g:126:4: array_idx
                     {
                     root_0 = (Object)adaptor.nil();
 
-                    pushFollow(FOLLOW_array_idx_in_array_idx_list813);
-                    array_idx67=array_idx();
+                    pushFollow(FOLLOW_array_idx_in_array_idx_list869);
+                    array_idx73=array_idx();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) adaptor.addChild(root_0, array_idx67.getTree());
+                    if ( backtracking==0 ) adaptor.addChild(root_0, array_idx73.getTree());
 
                     }
                     break;
@@ -3172,39 +3371,39 @@
     };
 
     // $ANTLR start array_idx
-    // dd/grammar/ECAGrammar.g:127:1: array_idx : LSQUARE expr RSQUARE -> ^( expr ) ;
+    // dd/grammar/ECAGrammar.g:129:1: array_idx : LSQUARE expr RSQUARE -> ^( expr ) ;
     public final array_idx_return array_idx() throws RecognitionException {
         array_idx_return retval = new array_idx_return();
         retval.start = input.LT(1);
 
         Object root_0 = null;
 
-        Token LSQUARE68=null;
-        Token RSQUARE70=null;
-        expr_return expr69 = null;
+        Token LSQUARE74=null;
+        Token RSQUARE76=null;
+        expr_return expr75 = null;
 
 
-        Object LSQUARE68_tree=null;
-        Object RSQUARE70_tree=null;
+        Object LSQUARE74_tree=null;
+        Object RSQUARE76_tree=null;
         RewriteRuleTokenStream stream_LSQUARE=new RewriteRuleTokenStream(adaptor,"token LSQUARE");
         RewriteRuleTokenStream stream_RSQUARE=new RewriteRuleTokenStream(adaptor,"token RSQUARE");
         RewriteRuleSubtreeStream stream_expr=new RewriteRuleSubtreeStream(adaptor,"rule expr");
         try {
-            // dd/grammar/ECAGrammar.g:128:2: ( LSQUARE expr RSQUARE -> ^( expr ) )
-            // dd/grammar/ECAGrammar.g:128:4: LSQUARE expr RSQUARE
+            // dd/grammar/ECAGrammar.g:130:2: ( LSQUARE expr RSQUARE -> ^( expr ) )
+            // dd/grammar/ECAGrammar.g:130:4: LSQUARE expr RSQUARE
             {
-            LSQUARE68=(Token)input.LT(1);
-            match(input,LSQUARE,FOLLOW_LSQUARE_in_array_idx824); if (failed) return retval;
-            if ( backtracking==0 ) stream_LSQUARE.add(LSQUARE68);
+            LSQUARE74=(Token)input.LT(1);
+            match(input,LSQUARE,FOLLOW_LSQUARE_in_array_idx880); if (failed) return retval;
+            if ( backtracking==0 ) stream_LSQUARE.add(LSQUARE74);
 
-            pushFollow(FOLLOW_expr_in_array_idx826);
-            expr69=expr();
+            pushFollow(FOLLOW_expr_in_array_idx882);
+            expr75=expr();
             _fsp--;
             if (failed) return retval;
-            if ( backtracking==0 ) stream_expr.add(expr69.getTree());
-            RSQUARE70=(Token)input.LT(1);
-            match(input,RSQUARE,FOLLOW_RSQUARE_in_array_idx828); if (failed) return retval;
-            if ( backtracking==0 ) stream_RSQUARE.add(RSQUARE70);
+            if ( backtracking==0 ) stream_expr.add(expr75.getTree());
+            RSQUARE76=(Token)input.LT(1);
+            match(input,RSQUARE,FOLLOW_RSQUARE_in_array_idx884); if (failed) return retval;
+            if ( backtracking==0 ) stream_RSQUARE.add(RSQUARE76);
 
 
             // AST REWRITE
@@ -3218,9 +3417,9 @@
             RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"token retval",retval!=null?retval.tree:null);
 
             root_0 = (Object)adaptor.nil();
-            // 128:27: -> ^( expr )
+            // 130:27: -> ^( expr )
             {
-                // dd/grammar/ECAGrammar.g:128:30: ^( expr )
+                // dd/grammar/ECAGrammar.g:130:30: ^( expr )
                 {
                 Object root_1 = (Object)adaptor.nil();
                 root_1 = (Object)adaptor.becomeRoot(stream_expr.nextNode(), root_1);
@@ -3257,25 +3456,25 @@
     };
 
     // $ANTLR start infix_oper
-    // dd/grammar/ECAGrammar.g:131:1: infix_oper : ( infix_bit_oper | infix_arith_oper | infix_bool_oper | infix_cmp_oper );
+    // dd/grammar/ECAGrammar.g:133:1: infix_oper : ( infix_bit_oper | infix_arith_oper | infix_bool_oper | infix_cmp_oper );
     public final infix_oper_return infix_oper() throws RecognitionException {
         infix_oper_return retval = new infix_oper_return();
         retval.start = input.LT(1);
 
         Object root_0 = null;
 
-        infix_bit_oper_return infix_bit_oper71 = null;
+        infix_bit_oper_return infix_bit_oper77 = null;
 
-        infix_arith_oper_return infix_arith_oper72 = null;
+        infix_arith_oper_return infix_arith_oper78 = null;
 
-        infix_bool_oper_return infix_bool_oper73 = null;
+        infix_bool_oper_return infix_bool_oper79 = null;
 
-        infix_cmp_oper_return infix_cmp_oper74 = null;
+        infix_cmp_oper_return infix_cmp_oper80 = null;
 
 
 
         try {
-            // dd/grammar/ECAGrammar.g:131:12: ( infix_bit_oper | infix_arith_oper | infix_bool_oper | infix_cmp_oper )
+            // dd/grammar/ECAGrammar.g:133:12: ( infix_bit_oper | infix_arith_oper | infix_bool_oper | infix_cmp_oper )
             int alt11=4;
             switch ( input.LA(1) ) {
             case BOR:
@@ -3312,61 +3511,61 @@
             default:
                 if (backtracking>0) {failed=true; return retval;}
                 NoViableAltException nvae =
-                    new NoViableAltException("131:1: infix_oper : ( infix_bit_oper | infix_arith_oper | infix_bool_oper | infix_cmp_oper );", 11, 0, input);
+                    new NoViableAltException("133:1: infix_oper : ( infix_bit_oper | infix_arith_oper | infix_bool_oper | infix_cmp_oper );", 11, 0, input);
 
                 throw nvae;
             }
 
             switch (alt11) {
                 case 1 :
-                    // dd/grammar/ECAGrammar.g:131:14: infix_bit_oper
+                    // dd/grammar/ECAGrammar.g:133:14: infix_bit_oper
                     {
                     root_0 = (Object)adaptor.nil();
 
-                    pushFollow(FOLLOW_infix_bit_oper_in_infix_oper846);
-                    infix_bit_oper71=infix_bit_oper();
+                    pushFollow(FOLLOW_infix_bit_oper_in_infix_oper902);
+                    infix_bit_oper77=infix_bit_oper();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) adaptor.addChild(root_0, infix_bit_oper71.getTree());
+                    if ( backtracking==0 ) adaptor.addChild(root_0, infix_bit_oper77.getTree());
 
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAGrammar.g:132:4: infix_arith_oper
+                    // dd/grammar/ECAGrammar.g:134:4: infix_arith_oper
                     {
                     root_0 = (Object)adaptor.nil();
 
-                    pushFollow(FOLLOW_infix_arith_oper_in_infix_oper851);
-                    infix_arith_oper72=infix_arith_oper();
+                    pushFollow(FOLLOW_infix_arith_oper_in_infix_oper907);
+                    infix_arith_oper78=infix_arith_oper();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) adaptor.addChild(root_0, infix_arith_oper72.getTree());
+                    if ( backtracking==0 ) adaptor.addChild(root_0, infix_arith_oper78.getTree());
 
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAGrammar.g:133:4: infix_bool_oper
+                    // dd/grammar/ECAGrammar.g:135:4: infix_bool_oper
                     {
                     root_0 = (Object)adaptor.nil();
 
-                    pushFollow(FOLLOW_infix_bool_oper_in_infix_oper856);
-                    infix_bool_oper73=infix_bool_oper();
+                    pushFollow(FOLLOW_infix_bool_oper_in_infix_oper912);
+                    infix_bool_oper79=infix_bool_oper();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) adaptor.addChild(root_0, infix_bool_oper73.getTree());
+                    if ( backtracking==0 ) adaptor.addChild(root_0, infix_bool_oper79.getTree());
 
                     }
                     break;
                 case 4 :
-                    // dd/grammar/ECAGrammar.g:134:4: infix_cmp_oper
+                    // dd/grammar/ECAGrammar.g:136:4: infix_cmp_oper
                     {
                     root_0 = (Object)adaptor.nil();
 
-                    pushFollow(FOLLOW_infix_cmp_oper_in_infix_oper861);
-                    infix_cmp_oper74=infix_cmp_oper();
+                    pushFollow(FOLLOW_infix_cmp_oper_in_infix_oper917);
+                    infix_cmp_oper80=infix_cmp_oper();
                     _fsp--;
                     if (failed) return retval;
-                    if ( backtracking==0 ) adaptor.addChild(root_0, infix_cmp_oper74.getTree());
+                    if ( backtracking==0 ) adaptor.addChild(root_0, infix_cmp_oper80.getTree());
 
                     }
                     break;
@@ -3395,27 +3594,27 @@
     };
 
     // $ANTLR start infix_bit_oper
-    // dd/grammar/ECAGrammar.g:137:1: infix_bit_oper : ( BAND | BOR | BXOR );
+    // dd/grammar/ECAGrammar.g:139:1: infix_bit_oper : ( BAND | BOR | BXOR );
     public final infix_bit_oper_return infix_bit_oper() throws RecognitionException {
         infix_bit_oper_return retval = new infix_bit_oper_return();
         retval.start = input.LT(1);
 
         Object root_0 = null;
 
-        Token set75=null;
+        Token set81=null;
 
-        Object set75_tree=null;
+        Object set81_tree=null;
 
         try {
-            // dd/grammar/ECAGrammar.g:138:2: ( BAND | BOR | BXOR )
+            // dd/grammar/ECAGrammar.g:140:2: ( BAND | BOR | BXOR )
             // dd/grammar/ECAGrammar.g:
             {
             root_0 = (Object)adaptor.nil();
 
-            set75=(Token)input.LT(1);
+            set81=(Token)input.LT(1);
             if ( (input.LA(1)>=BOR && input.LA(1)<=BXOR) ) {
                 input.consume();
-                if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set75));
+                if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set81));
                 errorRecovery=false;failed=false;
             }
             else {
@@ -3451,27 +3650,27 @@
     };
 
     // $ANTLR start infix_arith_oper
-    // dd/grammar/ECAGrammar.g:143:1: infix_arith_oper : ( MUL | DIV | PLUS | MINUS );
+    // dd/grammar/ECAGrammar.g:145:1: infix_arith_oper : ( MUL | DIV | PLUS | MINUS );
     public final infix_arith_oper_return infix_arith_oper() throws RecognitionException {
         infix_arith_oper_return retval = new infix_arith_oper_return();
         retval.start = input.LT(1);
 
         Object root_0 = null;
 
-        Token set76=null;
+        Token set82=null;
 
-        Object set76_tree=null;
+        Object set82_tree=null;
 
         try {
-            // dd/grammar/ECAGrammar.g:144:2: ( MUL | DIV | PLUS | MINUS )
+            // dd/grammar/ECAGrammar.g:146:2: ( MUL | DIV | PLUS | MINUS )
             // dd/grammar/ECAGrammar.g:
             {
             root_0 = (Object)adaptor.nil();
 
-            set76=(Token)input.LT(1);
+            set82=(Token)input.LT(1);
             if ( (input.LA(1)>=MUL && input.LA(1)<=MINUS) ) {
                 input.consume();
-                if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set76));
+                if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set82));
                 errorRecovery=false;failed=false;
             }
             else {
@@ -3507,27 +3706,27 @@
     };
 
     // $ANTLR start infix_bool_oper
-    // dd/grammar/ECAGrammar.g:150:1: infix_bool_oper : ( AND | OR );
+    // dd/grammar/ECAGrammar.g:152:1: infix_bool_oper : ( AND | OR );
     public final infix_bool_oper_return infix_bool_oper() throws RecognitionException {
         infix_bool_oper_return retval = new infix_bool_oper_return();
         retval.start = input.LT(1);
 
         Object root_0 = null;
 
-        Token set77=null;
+        Token set83=null;
 
-        Object set77_tree=null;
+        Object set83_tree=null;
 
         try {
-            // dd/grammar/ECAGrammar.g:151:2: ( AND | OR )
+            // dd/grammar/ECAGrammar.g:153:2: ( AND | OR )
             // dd/grammar/ECAGrammar.g:
             {
             root_0 = (Object)adaptor.nil();
 
-            set77=(Token)input.LT(1);
+            set83=(Token)input.LT(1);
             if ( (input.LA(1)>=OR && input.LA(1)<=AND) ) {
                 input.consume();
-                if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set77));
+                if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set83));
                 errorRecovery=false;failed=false;
             }
             else {
@@ -3563,27 +3762,27 @@
     };
 
     // $ANTLR start infix_cmp_oper
-    // dd/grammar/ECAGrammar.g:155:1: infix_cmp_oper : ( EQ | NEQ | GT | LT | GEQ | LEQ );
+    // dd/grammar/ECAGrammar.g:157:1: infix_cmp_oper : ( EQ | NEQ | GT | LT | GEQ | LEQ );
     public final infix_cmp_oper_return infix_cmp_oper() throws RecognitionException {
         infix_cmp_oper_return retval = new infix_cmp_oper_return();
         retval.start = input.LT(1);
 
         Object root_0 = null;
 
-        Token set78=null;
+        Token set84=null;
 
-        Object set78_tree=null;
+        Object set84_tree=null;
 
         try {
-            // dd/grammar/ECAGrammar.g:156:2: ( EQ | NEQ | GT | LT | GEQ | LEQ )
+            // dd/grammar/ECAGrammar.g:158:2: ( EQ | NEQ | GT | LT | GEQ | LEQ )
             // dd/grammar/ECAGrammar.g:
             {
             root_0 = (Object)adaptor.nil();
 
-            set78=(Token)input.LT(1);
+            set84=(Token)input.LT(1);
             if ( (input.LA(1)>=EQ && input.LA(1)<=LEQ) ) {
                 input.consume();
-                if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set78));
+                if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set84));
                 errorRecovery=false;failed=false;
             }
             else {
@@ -3619,27 +3818,27 @@
     };
 
     // $ANTLR start unary_oper
-    // dd/grammar/ECAGrammar.g:164:1: unary_oper : ( NOT | TWIDDLE );
+    // dd/grammar/ECAGrammar.g:166:1: unary_oper : ( NOT | TWIDDLE );
     public final unary_oper_return unary_oper() throws RecognitionException {
         unary_oper_return retval = new unary_oper_return();
         retval.start = input.LT(1);
 
         Object root_0 = null;
 
-        Token set79=null;
+        Token set85=null;
 
-        Object set79_tree=null;
+        Object set85_tree=null;
 
         try {
-            // dd/grammar/ECAGrammar.g:164:12: ( NOT | TWIDDLE )
+            // dd/grammar/ECAGrammar.g:166:12: ( NOT | TWIDDLE )
             // dd/grammar/ECAGrammar.g:
             {
             root_0 = (Object)adaptor.nil();
 
-            set79=(Token)input.LT(1);
+            set85=(Token)input.LT(1);
             if ( input.LA(1)==NOT||input.LA(1)==TWIDDLE ) {
                 input.consume();
-                if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set79));
+                if ( backtracking==0 ) adaptor.addChild(root_0, adaptor.create(set85));
                 errorRecovery=false;failed=false;
             }
             else {
@@ -3707,84 +3906,84 @@
     }
     // $ANTLR end synpred6
 
-    // $ANTLR start synpred9
-    public final void synpred9_fragment() throws RecognitionException {   
-        // dd/grammar/ECAGrammar.g:101:8: ( simple_expr infix_oper expr )
-        // dd/grammar/ECAGrammar.g:101:8: simple_expr infix_oper expr
+    // $ANTLR start synpred11
+    public final void synpred11_fragment() throws RecognitionException {   
+        // dd/grammar/ECAGrammar.g:103:8: ( simple_expr infix_oper expr )
+        // dd/grammar/ECAGrammar.g:103:8: simple_expr infix_oper expr
         {
-        pushFollow(FOLLOW_simple_expr_in_synpred9554);
+        pushFollow(FOLLOW_simple_expr_in_synpred11610);
         simple_expr();
         _fsp--;
         if (failed) return ;
-        pushFollow(FOLLOW_infix_oper_in_synpred9556);
+        pushFollow(FOLLOW_infix_oper_in_synpred11612);
         infix_oper();
         _fsp--;
         if (failed) return ;
-        pushFollow(FOLLOW_expr_in_synpred9558);
+        pushFollow(FOLLOW_expr_in_synpred11614);
         expr();
         _fsp--;
         if (failed) return ;
 
         }
     }
-    // $ANTLR end synpred9
+    // $ANTLR end synpred11
 
-    // $ANTLR start synpred10
-    public final void synpred10_fragment() throws RecognitionException {   
-        // dd/grammar/ECAGrammar.g:102:4: ( simple_expr )
-        // dd/grammar/ECAGrammar.g:102:4: simple_expr
+    // $ANTLR start synpred12
+    public final void synpred12_fragment() throws RecognitionException {   
+        // dd/grammar/ECAGrammar.g:104:4: ( simple_expr )
+        // dd/grammar/ECAGrammar.g:104:4: simple_expr
         {
-        pushFollow(FOLLOW_simple_expr_in_synpred10576);
+        pushFollow(FOLLOW_simple_expr_in_synpred12632);
         simple_expr();
         _fsp--;
         if (failed) return ;
 
         }
     }
-    // $ANTLR end synpred10
+    // $ANTLR end synpred12
 
-    // $ANTLR start synpred19
-    public final void synpred19_fragment() throws RecognitionException {   
-        // dd/grammar/ECAGrammar.g:118:4: ( expr SEPR expr_list )
-        // dd/grammar/ECAGrammar.g:118:4: expr SEPR expr_list
+    // $ANTLR start synpred21
+    public final void synpred21_fragment() throws RecognitionException {   
+        // dd/grammar/ECAGrammar.g:120:4: ( expr SEPR expr_list )
+        // dd/grammar/ECAGrammar.g:120:4: expr SEPR expr_list
         {
-        pushFollow(FOLLOW_expr_in_synpred19762);
+        pushFollow(FOLLOW_expr_in_synpred21818);
         expr();
         _fsp--;
         if (failed) return ;
-        match(input,SEPR,FOLLOW_SEPR_in_synpred19764); if (failed) return ;
-        pushFollow(FOLLOW_expr_list_in_synpred19766);
+        match(input,SEPR,FOLLOW_SEPR_in_synpred21820); if (failed) return ;
+        pushFollow(FOLLOW_expr_list_in_synpred21822);
         expr_list();
         _fsp--;
         if (failed) return ;
 
         }
     }
-    // $ANTLR end synpred19
+    // $ANTLR end synpred21
 
-    // $ANTLR start synpred20
-    public final void synpred20_fragment() throws RecognitionException {   
-        // dd/grammar/ECAGrammar.g:123:4: ( array_idx array_idx_list )
-        // dd/grammar/ECAGrammar.g:123:4: array_idx array_idx_list
+    // $ANTLR start synpred22
+    public final void synpred22_fragment() throws RecognitionException {   
+        // dd/grammar/ECAGrammar.g:125:4: ( array_idx array_idx_list )
+        // dd/grammar/ECAGrammar.g:125:4: array_idx array_idx_list
         {
-        pushFollow(FOLLOW_array_idx_in_synpred20794);
+        pushFollow(FOLLOW_array_idx_in_synpred22850);
         array_idx();
         _fsp--;
         if (failed) return ;
-        pushFollow(FOLLOW_array_idx_list_in_synpred20796);
+        pushFollow(FOLLOW_array_idx_list_in_synpred22852);
         array_idx_list();
         _fsp--;
         if (failed) return ;
 
         }
     }
-    // $ANTLR end synpred20
+    // $ANTLR end synpred22
 
-    public final boolean synpred9() {
+    public final boolean synpred12() {
         backtracking++;
         int start = input.mark();
         try {
-            synpred9_fragment(); // can never throw exception
+            synpred12_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -3794,11 +3993,11 @@
         failed=false;
         return success;
     }
-    public final boolean synpred19() {
+    public final boolean synpred1() {
         backtracking++;
         int start = input.mark();
         try {
-            synpred19_fragment(); // can never throw exception
+            synpred1_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -3808,11 +4007,11 @@
         failed=false;
         return success;
     }
-    public final boolean synpred20() {
+    public final boolean synpred11() {
         backtracking++;
         int start = input.mark();
         try {
-            synpred20_fragment(); // can never throw exception
+            synpred11_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -3822,11 +4021,11 @@
         failed=false;
         return success;
     }
-    public final boolean synpred1() {
+    public final boolean synpred6() {
         backtracking++;
         int start = input.mark();
         try {
-            synpred1_fragment(); // can never throw exception
+            synpred6_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -3836,11 +4035,11 @@
         failed=false;
         return success;
     }
-    public final boolean synpred6() {
+    public final boolean synpred22() {
         backtracking++;
         int start = input.mark();
         try {
-            synpred6_fragment(); // can never throw exception
+            synpred22_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -3850,11 +4049,11 @@
         failed=false;
         return success;
     }
-    public final boolean synpred10() {
+    public final boolean synpred21() {
         backtracking++;
         int start = input.mark();
         try {
-            synpred10_fragment(); // can never throw exception
+            synpred21_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -3870,19 +4069,19 @@
 
     public static final BitSet FOLLOW_eca_script_rule_one_in_eca_script_rule88 = new BitSet(new long[]{0x0000000000000000L});
     public static final BitSet FOLLOW_EOF_in_eca_script_rule90 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_RULE_in_eca_script_rule_one107 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_in_eca_script_rule_one107 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000004L});
     public static final BitSet FOLLOW_SYMBOL_in_eca_script_rule_one111 = new BitSet(new long[]{0x0000000000020000L});
-    public static final BitSet FOLLOW_CLASS_in_eca_script_rule_one115 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});
+    public static final BitSet FOLLOW_CLASS_in_eca_script_rule_one115 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000004L});
     public static final BitSet FOLLOW_SYMBOL_in_eca_script_rule_one119 = new BitSet(new long[]{0x0000000000040000L});
-    public static final BitSet FOLLOW_METHOD_in_eca_script_rule_one123 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});
+    public static final BitSet FOLLOW_METHOD_in_eca_script_rule_one123 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000004L});
     public static final BitSet FOLLOW_SYMBOL_in_eca_script_rule_one127 = new BitSet(new long[]{0x0000000000080000L});
     public static final BitSet FOLLOW_LINE_in_eca_script_rule_one131 = new BitSet(new long[]{0x0000000000001000L});
     public static final BitSet FOLLOW_NUMBER_in_eca_script_rule_one135 = new BitSet(new long[]{0x0000000000002000L});
-    public static final BitSet FOLLOW_BIND_in_eca_script_rule_one139 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});
+    public static final BitSet FOLLOW_BIND_in_eca_script_rule_one139 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000004L});
     public static final BitSet FOLLOW_event_in_eca_script_rule_one143 = new BitSet(new long[]{0x0000000000004000L});
-    public static final BitSet FOLLOW_IF_in_eca_script_rule_one147 = new BitSet(new long[]{0x2000401002C01000L,0x000000000000000AL});
+    public static final BitSet FOLLOW_IF_in_eca_script_rule_one147 = new BitSet(new long[]{0x4000802004C01000L,0x0000000000000014L});
     public static final BitSet FOLLOW_condition_in_eca_script_rule_one151 = new BitSet(new long[]{0x0000000000008000L});
-    public static final BitSet FOLLOW_DO_in_eca_script_rule_one155 = new BitSet(new long[]{0x2000401003201000L,0x000000000000000AL});
+    public static final BitSet FOLLOW_DO_in_eca_script_rule_one155 = new BitSet(new long[]{0x4000802007201000L,0x0000000000000014L});
     public static final BitSet FOLLOW_action_in_eca_script_rule_one159 = new BitSet(new long[]{0x0000000000100000L});
     public static final BitSet FOLLOW_ENDRULE_in_eca_script_rule_one163 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_eca_in_eca_rule200 = new BitSet(new long[]{0x0000000000000000L});
@@ -3893,22 +4092,22 @@
     public static final BitSet FOLLOW_EOF_in_eca_condition239 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_action_in_eca_action255 = new BitSet(new long[]{0x0000000000000000L});
     public static final BitSet FOLLOW_EOF_in_eca_action257 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_BIND_in_eca273 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});
+    public static final BitSet FOLLOW_BIND_in_eca273 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000004L});
     public static final BitSet FOLLOW_event_in_eca277 = new BitSet(new long[]{0x0000000000004000L});
-    public static final BitSet FOLLOW_IF_in_eca281 = new BitSet(new long[]{0x2000401002C01000L,0x000000000000000AL});
+    public static final BitSet FOLLOW_IF_in_eca281 = new BitSet(new long[]{0x4000802004C01000L,0x0000000000000014L});
     public static final BitSet FOLLOW_condition_in_eca285 = new BitSet(new long[]{0x0000000000008000L});
-    public static final BitSet FOLLOW_DO_in_eca289 = new BitSet(new long[]{0x2000401003201000L,0x000000000000000AL});
+    public static final BitSet FOLLOW_DO_in_eca289 = new BitSet(new long[]{0x4000802007201000L,0x0000000000000014L});
     public static final BitSet FOLLOW_action_in_eca293 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_bindings_in_event320 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_binding_in_bindings332 = new BitSet(new long[]{0x0000000080000000L});
-    public static final BitSet FOLLOW_SEPR_in_bindings334 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});
+    public static final BitSet FOLLOW_binding_in_bindings332 = new BitSet(new long[]{0x0000000100000000L});
+    public static final BitSet FOLLOW_SEPR_in_bindings334 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000004L});
     public static final BitSet FOLLOW_bindings_in_bindings336 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_binding_in_bindings351 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_bind_sym_in_binding361 = new BitSet(new long[]{0x0000000200000000L});
-    public static final BitSet FOLLOW_ASSIGN_in_binding363 = new BitSet(new long[]{0x2000401002001000L,0x000000000000000AL});
+    public static final BitSet FOLLOW_bind_sym_in_binding361 = new BitSet(new long[]{0x0000000400000000L});
+    public static final BitSet FOLLOW_ASSIGN_in_binding363 = new BitSet(new long[]{0x4000802004001000L,0x0000000000000014L});
     public static final BitSet FOLLOW_expr_in_binding365 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_SYMBOL_in_bind_sym388 = new BitSet(new long[]{0x0020000000000000L});
-    public static final BitSet FOLLOW_COLON_in_bind_sym390 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});
+    public static final BitSet FOLLOW_SYMBOL_in_bind_sym388 = new BitSet(new long[]{0x0040000000000000L});
+    public static final BitSet FOLLOW_COLON_in_bind_sym390 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000004L});
     public static final BitSet FOLLOW_SYMBOL_in_bind_sym394 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_SYMBOL_in_bind_sym412 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_TRUE_in_condition426 = new BitSet(new long[]{0x0000000000000002L});
@@ -3916,74 +4115,83 @@
     public static final BitSet FOLLOW_expr_in_condition450 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_NOTHING_in_action464 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_action_expr_list_in_action476 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_action_expr_in_action_expr_list487 = new BitSet(new long[]{0x0000000080000000L});
-    public static final BitSet FOLLOW_SEPR_in_action_expr_list489 = new BitSet(new long[]{0x2000401003001000L,0x000000000000000AL});
+    public static final BitSet FOLLOW_action_expr_in_action_expr_list487 = new BitSet(new long[]{0x0000000100000000L});
+    public static final BitSet FOLLOW_SEPR_in_action_expr_list489 = new BitSet(new long[]{0x4000802007001000L,0x0000000000000014L});
     public static final BitSet FOLLOW_action_expr_list_in_action_expr_list491 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_action_expr_in_action_expr_list506 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_RETURN_in_action_expr516 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_RETURN_in_action_expr528 = new BitSet(new long[]{0x2000401002001000L,0x000000000000000AL});
-    public static final BitSet FOLLOW_expr_in_action_expr530 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_expr_in_action_expr544 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_simple_expr_in_expr554 = new BitSet(new long[]{0x0007BFEC00000000L});
-    public static final BitSet FOLLOW_infix_oper_in_expr556 = new BitSet(new long[]{0x2000401002001000L,0x000000000000000AL});
-    public static final BitSet FOLLOW_expr_in_expr558 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_simple_expr_in_expr576 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_unary_oper_in_expr581 = new BitSet(new long[]{0x2000401002001000L,0x000000000000000AL});
-    public static final BitSet FOLLOW_expr_in_expr583 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_simple_expr_in_expr602 = new BitSet(new long[]{0x0010000000000000L});
-    public static final BitSet FOLLOW_TERN_IF_in_expr604 = new BitSet(new long[]{0x2000401002001000L,0x000000000000000AL});
-    public static final BitSet FOLLOW_expr_in_expr608 = new BitSet(new long[]{0x0020000000000000L});
-    public static final BitSet FOLLOW_COLON_in_expr610 = new BitSet(new long[]{0x2000401002001000L,0x000000000000000AL});
+    public static final BitSet FOLLOW_RETURN_in_action_expr530 = new BitSet(new long[]{0x4000802004001000L,0x0000000000000014L});
+    public static final BitSet FOLLOW_expr_in_action_expr532 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_THROW_in_action_expr548 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000004L});
+    public static final BitSet FOLLOW_SYMBOL_in_action_expr552 = new BitSet(new long[]{0x0000000004000000L});
+    public static final BitSet FOLLOW_LPAREN_in_action_expr554 = new BitSet(new long[]{0x0000000008000000L});
+    public static final BitSet FOLLOW_RPAREN_in_action_expr556 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_THROW_in_action_expr571 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000004L});
+    public static final BitSet FOLLOW_SYMBOL_in_action_expr575 = new BitSet(new long[]{0x0000000004000000L});
+    public static final BitSet FOLLOW_LPAREN_in_action_expr577 = new BitSet(new long[]{0x4000802004001000L,0x0000000000000014L});
+    public static final BitSet FOLLOW_expr_list_in_action_expr581 = new BitSet(new long[]{0x0000000008000000L});
+    public static final BitSet FOLLOW_RPAREN_in_action_expr583 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_expr_in_action_expr600 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_simple_expr_in_expr610 = new BitSet(new long[]{0x000F7FD800000000L});
+    public static final BitSet FOLLOW_infix_oper_in_expr612 = new BitSet(new long[]{0x4000802004001000L,0x0000000000000014L});
     public static final BitSet FOLLOW_expr_in_expr614 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_DOLLARSYM_in_simple_expr641 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_SYMBOL_in_simple_expr648 = new BitSet(new long[]{0x0000000008000000L});
-    public static final BitSet FOLLOW_array_idx_in_simple_expr652 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_SYMBOL_in_simple_expr673 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_LPAREN_in_simple_expr675 = new BitSet(new long[]{0x0000000004000000L});
-    public static final BitSet FOLLOW_RPAREN_in_simple_expr677 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_SYMBOL_in_simple_expr695 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_SYMBOL_in_simple_expr702 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_LPAREN_in_simple_expr704 = new BitSet(new long[]{0x2000401002001000L,0x000000000000000AL});
-    public static final BitSet FOLLOW_expr_list_in_simple_expr708 = new BitSet(new long[]{0x0000000004000000L});
-    public static final BitSet FOLLOW_RPAREN_in_simple_expr710 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_NUMBER_in_simple_expr729 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_STRING_in_simple_expr734 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LPAREN_in_simple_expr739 = new BitSet(new long[]{0x2000401002001000L,0x000000000000000AL});
-    public static final BitSet FOLLOW_expr_in_simple_expr741 = new BitSet(new long[]{0x0000000004000000L});
-    public static final BitSet FOLLOW_RPAREN_in_simple_expr743 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_expr_in_expr_list762 = new BitSet(new long[]{0x0000000080000000L});
-    public static final BitSet FOLLOW_SEPR_in_expr_list764 = new BitSet(new long[]{0x2000401002001000L,0x000000000000000AL});
-    public static final BitSet FOLLOW_expr_list_in_expr_list766 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_expr_in_expr_list783 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_array_idx_in_array_idx_list794 = new BitSet(new long[]{0x0000000008000000L});
-    public static final BitSet FOLLOW_array_idx_list_in_array_idx_list796 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_array_idx_in_array_idx_list813 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_LSQUARE_in_array_idx824 = new BitSet(new long[]{0x2000401002001000L,0x000000000000000AL});
-    public static final BitSet FOLLOW_expr_in_array_idx826 = new BitSet(new long[]{0x0000000010000000L});
-    public static final BitSet FOLLOW_RSQUARE_in_array_idx828 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_infix_bit_oper_in_infix_oper846 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_infix_arith_oper_in_infix_oper851 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_infix_bool_oper_in_infix_oper856 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_infix_cmp_oper_in_infix_oper861 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_simple_expr_in_expr632 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_unary_oper_in_expr637 = new BitSet(new long[]{0x4000802004001000L,0x0000000000000014L});
+    public static final BitSet FOLLOW_expr_in_expr639 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_simple_expr_in_expr658 = new BitSet(new long[]{0x0020000000000000L});
+    public static final BitSet FOLLOW_TERN_IF_in_expr660 = new BitSet(new long[]{0x4000802004001000L,0x0000000000000014L});
+    public static final BitSet FOLLOW_expr_in_expr664 = new BitSet(new long[]{0x0040000000000000L});
+    public static final BitSet FOLLOW_COLON_in_expr666 = new BitSet(new long[]{0x4000802004001000L,0x0000000000000014L});
+    public static final BitSet FOLLOW_expr_in_expr670 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_DOLLARSYM_in_simple_expr697 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_SYMBOL_in_simple_expr704 = new BitSet(new long[]{0x0000000010000000L});
+    public static final BitSet FOLLOW_array_idx_in_simple_expr708 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_SYMBOL_in_simple_expr729 = new BitSet(new long[]{0x0000000004000000L});
+    public static final BitSet FOLLOW_LPAREN_in_simple_expr731 = new BitSet(new long[]{0x0000000008000000L});
+    public static final BitSet FOLLOW_RPAREN_in_simple_expr733 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_SYMBOL_in_simple_expr751 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_SYMBOL_in_simple_expr758 = new BitSet(new long[]{0x0000000004000000L});
+    public static final BitSet FOLLOW_LPAREN_in_simple_expr760 = new BitSet(new long[]{0x4000802004001000L,0x0000000000000014L});
+    public static final BitSet FOLLOW_expr_list_in_simple_expr764 = new BitSet(new long[]{0x0000000008000000L});
+    public static final BitSet FOLLOW_RPAREN_in_simple_expr766 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_NUMBER_in_simple_expr785 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_STRING_in_simple_expr790 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LPAREN_in_simple_expr795 = new BitSet(new long[]{0x4000802004001000L,0x0000000000000014L});
+    public static final BitSet FOLLOW_expr_in_simple_expr797 = new BitSet(new long[]{0x0000000008000000L});
+    public static final BitSet FOLLOW_RPAREN_in_simple_expr799 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_expr_in_expr_list818 = new BitSet(new long[]{0x0000000100000000L});
+    public static final BitSet FOLLOW_SEPR_in_expr_list820 = new BitSet(new long[]{0x4000802004001000L,0x0000000000000014L});
+    public static final BitSet FOLLOW_expr_list_in_expr_list822 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_expr_in_expr_list839 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_array_idx_in_array_idx_list850 = new BitSet(new long[]{0x0000000010000000L});
+    public static final BitSet FOLLOW_array_idx_list_in_array_idx_list852 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_array_idx_in_array_idx_list869 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_LSQUARE_in_array_idx880 = new BitSet(new long[]{0x4000802004001000L,0x0000000000000014L});
+    public static final BitSet FOLLOW_expr_in_array_idx882 = new BitSet(new long[]{0x0000000020000000L});
+    public static final BitSet FOLLOW_RSQUARE_in_array_idx884 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_infix_bit_oper_in_infix_oper902 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_infix_arith_oper_in_infix_oper907 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_infix_bool_oper_in_infix_oper912 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_infix_cmp_oper_in_infix_oper917 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_set_in_infix_bit_oper0 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_set_in_infix_arith_oper0 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_set_in_infix_bool_oper0 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_set_in_infix_cmp_oper0 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_set_in_unary_oper0 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_binding_in_synpred1332 = new BitSet(new long[]{0x0000000080000000L});
-    public static final BitSet FOLLOW_SEPR_in_synpred1334 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});
+    public static final BitSet FOLLOW_binding_in_synpred1332 = new BitSet(new long[]{0x0000000100000000L});
+    public static final BitSet FOLLOW_SEPR_in_synpred1334 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000004L});
     public static final BitSet FOLLOW_bindings_in_synpred1336 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_action_expr_in_synpred6487 = new BitSet(new long[]{0x0000000080000000L});
-    public static final BitSet FOLLOW_SEPR_in_synpred6489 = new BitSet(new long[]{0x2000401003001000L,0x000000000000000AL});
+    public static final BitSet FOLLOW_action_expr_in_synpred6487 = new BitSet(new long[]{0x0000000100000000L});
+    public static final BitSet FOLLOW_SEPR_in_synpred6489 = new BitSet(new long[]{0x4000802007001000L,0x0000000000000014L});
     public static final BitSet FOLLOW_action_expr_list_in_synpred6491 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_simple_expr_in_synpred9554 = new BitSet(new long[]{0x0007BFEC00000000L});
-    public static final BitSet FOLLOW_infix_oper_in_synpred9556 = new BitSet(new long[]{0x2000401002001000L,0x000000000000000AL});
-    public static final BitSet FOLLOW_expr_in_synpred9558 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_simple_expr_in_synpred10576 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_expr_in_synpred19762 = new BitSet(new long[]{0x0000000080000000L});
-    public static final BitSet FOLLOW_SEPR_in_synpred19764 = new BitSet(new long[]{0x2000401002001000L,0x000000000000000AL});
-    public static final BitSet FOLLOW_expr_list_in_synpred19766 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_array_idx_in_synpred20794 = new BitSet(new long[]{0x0000000008000000L});
-    public static final BitSet FOLLOW_array_idx_list_in_synpred20796 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_simple_expr_in_synpred11610 = new BitSet(new long[]{0x000F7FD800000000L});
+    public static final BitSet FOLLOW_infix_oper_in_synpred11612 = new BitSet(new long[]{0x4000802004001000L,0x0000000000000014L});
+    public static final BitSet FOLLOW_expr_in_synpred11614 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_simple_expr_in_synpred12632 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_expr_in_synpred21818 = new BitSet(new long[]{0x0000000100000000L});
+    public static final BitSet FOLLOW_SEPR_in_synpred21820 = new BitSet(new long[]{0x4000802004001000L,0x0000000000000014L});
+    public static final BitSet FOLLOW_expr_list_in_synpred21822 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_array_idx_in_synpred22850 = new BitSet(new long[]{0x0000000010000000L});
+    public static final BitSet FOLLOW_array_idx_list_in_synpred22852 = new BitSet(new long[]{0x0000000000000002L});
 
 }
\ No newline at end of file

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECATokenLexer.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECATokenLexer.java	2008-09-30 13:06:38 UTC (rev 23222)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/grammar/ECATokenLexer.java	2008-09-30 13:44:48 UTC (rev 23223)
@@ -1,4 +1,4 @@
-// $ANTLR 3.0.1 dd/grammar/ECAToken.g 2008-09-25 12:22:32
+// $ANTLR 3.0.1 dd/grammar/ECAToken.g 2008-09-30 13:45:22
 
 package org.jboss.jbossts.orchestration.rule.grammar;
 
@@ -9,73 +9,74 @@
 import java.util.ArrayList;
 
 public class ECATokenLexer extends Lexer {
-    public static final int MINUS=50;
+    public static final int MINUS=51;
     public static final int NUMBER=12;
     public static final int METHOD=18;
     public static final int FLOAT=11;
     public static final int FALSE=23;
     public static final int POSDIGIT=5;
-    public static final int TWIDDLE=46;
-    public static final int LEQ=42;
+    public static final int TWIDDLE=47;
+    public static final int LEQ=43;
     public static final int RULE=16;
-    public static final int MOD=51;
-    public static final int GEQ=41;
-    public static final int DQUOTE=57;
-    public static final int OR=34;
-    public static final int BOR=43;
+    public static final int MOD=52;
+    public static final int GEQ=42;
+    public static final int DQUOTE=58;
+    public static final int BOR=44;
+    public static final int OR=35;
     public static final int BAREINT=7;
-    public static final int LBRACE=29;
-    public static final int NEWLINE=59;
-    public static final int DOT=32;
-    public static final int RBRACE=30;
+    public static final int LBRACE=30;
+    public static final int NEWLINE=60;
+    public static final int DOT=33;
+    public static final int RBRACE=31;
     public static final int INTEGER=8;
-    public static final int AND=35;
-    public static final int ASSIGN=33;
-    public static final int SYMBOL=65;
-    public static final int RPAREN=26;
+    public static final int AND=36;
+    public static final int ASSIGN=34;
+    public static final int SYMBOL=66;
+    public static final int RPAREN=27;
     public static final int SIGN=6;
-    public static final int LPAREN=25;
-    public static final int PLUS=49;
+    public static final int LPAREN=26;
+    public static final int PLUS=50;
     public static final int DIGIT=4;
     public static final int LINE=19;
-    public static final int BAND=44;
-    public static final int NEQ=38;
-    public static final int SPACE=58;
-    public static final int LETTER=54;
-    public static final int LSQUARE=27;
+    public static final int BAND=45;
+    public static final int NEQ=39;
+    public static final int SPACE=59;
+    public static final int LETTER=55;
+    public static final int LSQUARE=28;
     public static final int DO=15;
     public static final int POINT=9;
-    public static final int BARESYM=62;
+    public static final int BARESYM=63;
     public static final int NOTHING=21;
-    public static final int SEPR=31;
-    public static final int WS=68;
-    public static final int STRING=61;
-    public static final int EQ=37;
-    public static final int QUOTSYM=63;
-    public static final int LT=40;
-    public static final int GT=39;
-    public static final int DOLLAR=66;
-    public static final int RSQUARE=28;
-    public static final int QUOTE=56;
-    public static final int TERN_IF=52;
-    public static final int MUL=47;
+    public static final int SEPR=32;
+    public static final int WS=69;
+    public static final int STRING=62;
+    public static final int EQ=38;
+    public static final int QUOTSYM=64;
+    public static final int LT=41;
+    public static final int GT=40;
+    public static final int DOLLAR=67;
+    public static final int RSQUARE=29;
+    public static final int QUOTE=57;
+    public static final int TERN_IF=53;
+    public static final int MUL=48;
     public static final int CLASS=17;
     public static final int EXPPART=10;
-    public static final int PUNCT=60;
+    public static final int PUNCT=61;
     public static final int RETURN=24;
     public static final int IF=14;
     public static final int EOF=-1;
-    public static final int Tokens=69;
-    public static final int COLON=53;
-    public static final int DIV=48;
-    public static final int DOTSYM=64;
-    public static final int BXOR=45;
+    public static final int Tokens=70;
+    public static final int COLON=54;
+    public static final int DIV=49;
+    public static final int DOTSYM=65;
+    public static final int BXOR=46;
     public static final int ENDRULE=20;
     public static final int BIND=13;
-    public static final int NOT=36;
+    public static final int NOT=37;
     public static final int TRUE=22;
-    public static final int UNDERSCORE=55;
-    public static final int DOLLARSYM=67;
+    public static final int UNDERSCORE=56;
+    public static final int THROW=25;
+    public static final int DOLLARSYM=68;
     public ECATokenLexer() {;} 
     public ECATokenLexer(CharStream input) {
         super(input);
@@ -681,12 +682,58 @@
     }
     // $ANTLR end RETURN
 
+    // $ANTLR start THROW
+    public final void mTHROW() throws RecognitionException {
+        try {
+            int _type = THROW;
+            // dd/grammar/ECAToken.g:82:7: ( 'THROW' | 'throw' )
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0=='T') ) {
+                alt10=1;
+            }
+            else if ( (LA10_0=='t') ) {
+                alt10=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("82:1: THROW : ( 'THROW' | 'throw' );", 10, 0, input);
+
+                throw nvae;
+            }
+            switch (alt10) {
+                case 1 :
+                    // dd/grammar/ECAToken.g:82:9: 'THROW'
+                    {
+                    match("THROW"); 
+
+
+                    }
+                    break;
+                case 2 :
+                    // dd/grammar/ECAToken.g:82:17: 'throw'
+                    {
+                    match("throw"); 
+
+
+                    }
+                    break;
+
+            }
+            this.type = _type;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end THROW
+
     // $ANTLR start LPAREN
     public final void mLPAREN() throws RecognitionException {
         try {
             int _type = LPAREN;
-            // dd/grammar/ECAToken.g:84:8: ( '(' )
-            // dd/grammar/ECAToken.g:84:10: '('
+            // dd/grammar/ECAToken.g:87:8: ( '(' )
+            // dd/grammar/ECAToken.g:87:10: '('
             {
             match('('); 
 
@@ -703,8 +750,8 @@
     public final void mRPAREN() throws RecognitionException {
         try {
             int _type = RPAREN;
-            // dd/grammar/ECAToken.g:87:8: ( ')' )
-            // dd/grammar/ECAToken.g:87:10: ')'
+            // dd/grammar/ECAToken.g:90:8: ( ')' )
+            // dd/grammar/ECAToken.g:90:10: ')'
             {
             match(')'); 
 
@@ -721,8 +768,8 @@
     public final void mLSQUARE() throws RecognitionException {
         try {
             int _type = LSQUARE;
-            // dd/grammar/ECAToken.g:90:9: ( '\\[' )
-            // dd/grammar/ECAToken.g:90:11: '\\['
+            // dd/grammar/ECAToken.g:93:9: ( '\\[' )
+            // dd/grammar/ECAToken.g:93:11: '\\['
             {
             match('['); 
 
@@ -739,8 +786,8 @@
     public final void mRSQUARE() throws RecognitionException {
         try {
             int _type = RSQUARE;
-            // dd/grammar/ECAToken.g:93:9: ( '\\]' )
-            // dd/grammar/ECAToken.g:93:11: '\\]'
+            // dd/grammar/ECAToken.g:96:9: ( '\\]' )
+            // dd/grammar/ECAToken.g:96:11: '\\]'
             {
             match(']'); 
 
@@ -757,8 +804,8 @@
     public final void mLBRACE() throws RecognitionException {
         try {
             int _type = LBRACE;
-            // dd/grammar/ECAToken.g:96:8: ( '{' )
-            // dd/grammar/ECAToken.g:96:10: '{'
+            // dd/grammar/ECAToken.g:99:8: ( '{' )
+            // dd/grammar/ECAToken.g:99:10: '{'
             {
             match('{'); 
 
@@ -775,8 +822,8 @@
     public final void mRBRACE() throws RecognitionException {
         try {
             int _type = RBRACE;
-            // dd/grammar/ECAToken.g:99:8: ( '}' )
-            // dd/grammar/ECAToken.g:99:10: '}'
+            // dd/grammar/ECAToken.g:102:8: ( '}' )
+            // dd/grammar/ECAToken.g:102:10: '}'
             {
             match('}'); 
 
@@ -793,7 +840,7 @@
     public final void mSEPR() throws RecognitionException {
         try {
             int _type = SEPR;
-            // dd/grammar/ECAToken.g:104:6: ( ';' | ',' )
+            // dd/grammar/ECAToken.g:107:6: ( ';' | ',' )
             // dd/grammar/ECAToken.g:
             {
             if ( input.LA(1)==','||input.LA(1)==';' ) {
@@ -820,8 +867,8 @@
     public final void mDOT() throws RecognitionException {
         try {
             int _type = DOT;
-            // dd/grammar/ECAToken.g:110:5: ( '.' )
-            // dd/grammar/ECAToken.g:110:7: '.'
+            // dd/grammar/ECAToken.g:113:5: ( '.' )
+            // dd/grammar/ECAToken.g:113:7: '.'
             {
             match('.'); 
 
@@ -838,32 +885,32 @@
     public final void mASSIGN() throws RecognitionException {
         try {
             int _type = ASSIGN;
-            // dd/grammar/ECAToken.g:115:8: ( '=' | '<--' )
-            int alt10=2;
-            int LA10_0 = input.LA(1);
+            // dd/grammar/ECAToken.g:118:8: ( '=' | '<--' )
+            int alt11=2;
+            int LA11_0 = input.LA(1);
 
-            if ( (LA10_0=='=') ) {
-                alt10=1;
+            if ( (LA11_0=='=') ) {
+                alt11=1;
             }
-            else if ( (LA10_0=='<') ) {
-                alt10=2;
+            else if ( (LA11_0=='<') ) {
+                alt11=2;
             }
             else {
                 NoViableAltException nvae =
-                    new NoViableAltException("115:1: ASSIGN : ( '=' | '<--' );", 10, 0, input);
+                    new NoViableAltException("118:1: ASSIGN : ( '=' | '<--' );", 11, 0, input);
 
                 throw nvae;
             }
-            switch (alt10) {
+            switch (alt11) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:115:10: '='
+                    // dd/grammar/ECAToken.g:118:10: '='
                     {
                     match('='); 
 
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:116:4: '<--'
+                    // dd/grammar/ECAToken.g:119:4: '<--'
                     {
                     match("<--"); 
 
@@ -883,34 +930,34 @@
     public final void mOR() throws RecognitionException {
         try {
             int _type = OR;
-            // dd/grammar/ECAToken.g:121:4: ( '||' | 'OR' | 'or' )
-            int alt11=3;
+            // dd/grammar/ECAToken.g:124:4: ( '||' | 'OR' | 'or' )
+            int alt12=3;
             switch ( input.LA(1) ) {
             case '|':
                 {
-                alt11=1;
+                alt12=1;
                 }
                 break;
             case 'O':
                 {
-                alt11=2;
+                alt12=2;
                 }
                 break;
             case 'o':
                 {
-                alt11=3;
+                alt12=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("121:1: OR : ( '||' | 'OR' | 'or' );", 11, 0, input);
+                    new NoViableAltException("124:1: OR : ( '||' | 'OR' | 'or' );", 12, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt11) {
+            switch (alt12) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:121:6: '||'
+                    // dd/grammar/ECAToken.g:124:6: '||'
                     {
                     match("||"); 
 
@@ -918,7 +965,7 @@
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:122:4: 'OR'
+                    // dd/grammar/ECAToken.g:125:4: 'OR'
                     {
                     match("OR"); 
 
@@ -926,7 +973,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:123:4: 'or'
+                    // dd/grammar/ECAToken.g:126:4: 'or'
                     {
                     match("or"); 
 
@@ -946,34 +993,34 @@
     public final void mAND() throws RecognitionException {
         try {
             int _type = AND;
-            // dd/grammar/ECAToken.g:126:5: ( '&&' | 'AND' | 'and' )
-            int alt12=3;
+            // dd/grammar/ECAToken.g:129:5: ( '&&' | 'AND' | 'and' )
+            int alt13=3;
             switch ( input.LA(1) ) {
             case '&':
                 {
-                alt12=1;
+                alt13=1;
                 }
                 break;
             case 'A':
                 {
-                alt12=2;
+                alt13=2;
                 }
                 break;
             case 'a':
                 {
-                alt12=3;
+                alt13=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("126:1: AND : ( '&&' | 'AND' | 'and' );", 12, 0, input);
+                    new NoViableAltException("129:1: AND : ( '&&' | 'AND' | 'and' );", 13, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt12) {
+            switch (alt13) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:126:7: '&&'
+                    // dd/grammar/ECAToken.g:129:7: '&&'
                     {
                     match("&&"); 
 
@@ -981,7 +1028,7 @@
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:127:4: 'AND'
+                    // dd/grammar/ECAToken.g:130:4: 'AND'
                     {
                     match("AND"); 
 
@@ -989,7 +1036,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:128:4: 'and'
+                    // dd/grammar/ECAToken.g:131:4: 'and'
                     {
                     match("and"); 
 
@@ -1009,41 +1056,41 @@
     public final void mNOT() throws RecognitionException {
         try {
             int _type = NOT;
-            // dd/grammar/ECAToken.g:131:5: ( '!' | 'NOT' | 'not' )
-            int alt13=3;
+            // dd/grammar/ECAToken.g:134:5: ( '!' | 'NOT' | 'not' )
+            int alt14=3;
             switch ( input.LA(1) ) {
             case '!':
                 {
-                alt13=1;
+                alt14=1;
                 }
                 break;
             case 'N':
                 {
-                alt13=2;
+                alt14=2;
                 }
                 break;
             case 'n':
                 {
-                alt13=3;
+                alt14=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("131:1: NOT : ( '!' | 'NOT' | 'not' );", 13, 0, input);
+                    new NoViableAltException("134:1: NOT : ( '!' | 'NOT' | 'not' );", 14, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt13) {
+            switch (alt14) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:131:7: '!'
+                    // dd/grammar/ECAToken.g:134:7: '!'
                     {
                     match('!'); 
 
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:132:4: 'NOT'
+                    // dd/grammar/ECAToken.g:135:4: 'NOT'
                     {
                     match("NOT"); 
 
@@ -1051,7 +1098,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:133:4: 'not'
+                    // dd/grammar/ECAToken.g:136:4: 'not'
                     {
                     match("not"); 
 
@@ -1071,34 +1118,34 @@
     public final void mEQ() throws RecognitionException {
         try {
             int _type = EQ;
-            // dd/grammar/ECAToken.g:138:4: ( '==' | 'EQ' | 'eq' )
-            int alt14=3;
+            // dd/grammar/ECAToken.g:141:4: ( '==' | 'EQ' | 'eq' )
+            int alt15=3;
             switch ( input.LA(1) ) {
             case '=':
                 {
-                alt14=1;
+                alt15=1;
                 }
                 break;
             case 'E':
                 {
-                alt14=2;
+                alt15=2;
                 }
                 break;
             case 'e':
                 {
-                alt14=3;
+                alt15=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("138:1: EQ : ( '==' | 'EQ' | 'eq' );", 14, 0, input);
+                    new NoViableAltException("141:1: EQ : ( '==' | 'EQ' | 'eq' );", 15, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt14) {
+            switch (alt15) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:138:6: '=='
+                    // dd/grammar/ECAToken.g:141:6: '=='
                     {
                     match("=="); 
 
@@ -1106,7 +1153,7 @@
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:139:4: 'EQ'
+                    // dd/grammar/ECAToken.g:142:4: 'EQ'
                     {
                     match("EQ"); 
 
@@ -1114,7 +1161,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:140:4: 'eq'
+                    // dd/grammar/ECAToken.g:143:4: 'eq'
                     {
                     match("eq"); 
 
@@ -1134,34 +1181,34 @@
     public final void mNEQ() throws RecognitionException {
         try {
             int _type = NEQ;
-            // dd/grammar/ECAToken.g:143:5: ( '!=' | 'NEQ' | 'neq' )
-            int alt15=3;
+            // dd/grammar/ECAToken.g:146:5: ( '!=' | 'NEQ' | 'neq' )
+            int alt16=3;
             switch ( input.LA(1) ) {
             case '!':
                 {
-                alt15=1;
+                alt16=1;
                 }
                 break;
             case 'N':
                 {
-                alt15=2;
+                alt16=2;
                 }
                 break;
             case 'n':
                 {
-                alt15=3;
+                alt16=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("143:1: NEQ : ( '!=' | 'NEQ' | 'neq' );", 15, 0, input);
+                    new NoViableAltException("146:1: NEQ : ( '!=' | 'NEQ' | 'neq' );", 16, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt15) {
+            switch (alt16) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:143:7: '!='
+                    // dd/grammar/ECAToken.g:146:7: '!='
                     {
                     match("!="); 
 
@@ -1169,7 +1216,7 @@
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:144:4: 'NEQ'
+                    // dd/grammar/ECAToken.g:147:4: 'NEQ'
                     {
                     match("NEQ"); 
 
@@ -1177,7 +1224,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:145:4: 'neq'
+                    // dd/grammar/ECAToken.g:148:4: 'neq'
                     {
                     match("neq"); 
 
@@ -1197,41 +1244,41 @@
     public final void mGT() throws RecognitionException {
         try {
             int _type = GT;
-            // dd/grammar/ECAToken.g:148:4: ( '>' | 'GT' | 'gt' )
-            int alt16=3;
+            // dd/grammar/ECAToken.g:151:4: ( '>' | 'GT' | 'gt' )
+            int alt17=3;
             switch ( input.LA(1) ) {
             case '>':
                 {
-                alt16=1;
+                alt17=1;
                 }
                 break;
             case 'G':
                 {
-                alt16=2;
+                alt17=2;
                 }
                 break;
             case 'g':
                 {
-                alt16=3;
+                alt17=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("148:1: GT : ( '>' | 'GT' | 'gt' );", 16, 0, input);
+                    new NoViableAltException("151:1: GT : ( '>' | 'GT' | 'gt' );", 17, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt16) {
+            switch (alt17) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:148:6: '>'
+                    // dd/grammar/ECAToken.g:151:6: '>'
                     {
                     match('>'); 
 
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:149:4: 'GT'
+                    // dd/grammar/ECAToken.g:152:4: 'GT'
                     {
                     match("GT"); 
 
@@ -1239,7 +1286,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:150:4: 'gt'
+                    // dd/grammar/ECAToken.g:153:4: 'gt'
                     {
                     match("gt"); 
 
@@ -1259,41 +1306,41 @@
     public final void mLT() throws RecognitionException {
         try {
             int _type = LT;
-            // dd/grammar/ECAToken.g:153:4: ( '<' | 'LT' | 'lt' )
-            int alt17=3;
+            // dd/grammar/ECAToken.g:156:4: ( '<' | 'LT' | 'lt' )
+            int alt18=3;
             switch ( input.LA(1) ) {
             case '<':
                 {
-                alt17=1;
+                alt18=1;
                 }
                 break;
             case 'L':
                 {
-                alt17=2;
+                alt18=2;
                 }
                 break;
             case 'l':
                 {
-                alt17=3;
+                alt18=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("153:1: LT : ( '<' | 'LT' | 'lt' );", 17, 0, input);
+                    new NoViableAltException("156:1: LT : ( '<' | 'LT' | 'lt' );", 18, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt17) {
+            switch (alt18) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:153:6: '<'
+                    // dd/grammar/ECAToken.g:156:6: '<'
                     {
                     match('<'); 
 
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:154:4: 'LT'
+                    // dd/grammar/ECAToken.g:157:4: 'LT'
                     {
                     match("LT"); 
 
@@ -1301,7 +1348,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:155:4: 'lt'
+                    // dd/grammar/ECAToken.g:158:4: 'lt'
                     {
                     match("lt"); 
 
@@ -1321,34 +1368,34 @@
     public final void mGEQ() throws RecognitionException {
         try {
             int _type = GEQ;
-            // dd/grammar/ECAToken.g:158:5: ( '>=' | 'EQ' | 'geq' )
-            int alt18=3;
+            // dd/grammar/ECAToken.g:161:5: ( '>=' | 'EQ' | 'geq' )
+            int alt19=3;
             switch ( input.LA(1) ) {
             case '>':
                 {
-                alt18=1;
+                alt19=1;
                 }
                 break;
             case 'E':
                 {
-                alt18=2;
+                alt19=2;
                 }
                 break;
             case 'g':
                 {
-                alt18=3;
+                alt19=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("158:1: GEQ : ( '>=' | 'EQ' | 'geq' );", 18, 0, input);
+                    new NoViableAltException("161:1: GEQ : ( '>=' | 'EQ' | 'geq' );", 19, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt18) {
+            switch (alt19) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:158:7: '>='
+                    // dd/grammar/ECAToken.g:161:7: '>='
                     {
                     match(">="); 
 
@@ -1356,7 +1403,7 @@
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:159:4: 'EQ'
+                    // dd/grammar/ECAToken.g:162:4: 'EQ'
                     {
                     match("EQ"); 
 
@@ -1364,7 +1411,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:160:4: 'geq'
+                    // dd/grammar/ECAToken.g:163:4: 'geq'
                     {
                     match("geq"); 
 
@@ -1384,34 +1431,34 @@
     public final void mLEQ() throws RecognitionException {
         try {
             int _type = LEQ;
-            // dd/grammar/ECAToken.g:163:5: ( '<=' | 'LEQ' | 'leq' )
-            int alt19=3;
+            // dd/grammar/ECAToken.g:166:5: ( '<=' | 'LEQ' | 'leq' )
+            int alt20=3;
             switch ( input.LA(1) ) {
             case '<':
                 {
-                alt19=1;
+                alt20=1;
                 }
                 break;
             case 'L':
                 {
-                alt19=2;
+                alt20=2;
                 }
                 break;
             case 'l':
                 {
-                alt19=3;
+                alt20=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("163:1: LEQ : ( '<=' | 'LEQ' | 'leq' );", 19, 0, input);
+                    new NoViableAltException("166:1: LEQ : ( '<=' | 'LEQ' | 'leq' );", 20, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt19) {
+            switch (alt20) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:163:7: '<='
+                    // dd/grammar/ECAToken.g:166:7: '<='
                     {
                     match("<="); 
 
@@ -1419,7 +1466,7 @@
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:164:4: 'LEQ'
+                    // dd/grammar/ECAToken.g:167:4: 'LEQ'
                     {
                     match("LEQ"); 
 
@@ -1427,7 +1474,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:165:4: 'leq'
+                    // dd/grammar/ECAToken.g:168:4: 'leq'
                     {
                     match("leq"); 
 
@@ -1447,8 +1494,8 @@
     public final void mBOR() throws RecognitionException {
         try {
             int _type = BOR;
-            // dd/grammar/ECAToken.g:170:5: ( '|' )
-            // dd/grammar/ECAToken.g:170:7: '|'
+            // dd/grammar/ECAToken.g:173:5: ( '|' )
+            // dd/grammar/ECAToken.g:173:7: '|'
             {
             match('|'); 
 
@@ -1465,8 +1512,8 @@
     public final void mBAND() throws RecognitionException {
         try {
             int _type = BAND;
-            // dd/grammar/ECAToken.g:173:6: ( '&' )
-            // dd/grammar/ECAToken.g:173:8: '&'
+            // dd/grammar/ECAToken.g:176:6: ( '&' )
+            // dd/grammar/ECAToken.g:176:8: '&'
             {
             match('&'); 
 
@@ -1483,8 +1530,8 @@
     public final void mBXOR() throws RecognitionException {
         try {
             int _type = BXOR;
-            // dd/grammar/ECAToken.g:176:6: ( '^' )
-            // dd/grammar/ECAToken.g:176:8: '^'
+            // dd/grammar/ECAToken.g:179:6: ( '^' )
+            // dd/grammar/ECAToken.g:179:8: '^'
             {
             match('^'); 
 
@@ -1501,8 +1548,8 @@
     public final void mTWIDDLE() throws RecognitionException {
         try {
             int _type = TWIDDLE;
-            // dd/grammar/ECAToken.g:179:9: ( '~' )
-            // dd/grammar/ECAToken.g:179:11: '~'
+            // dd/grammar/ECAToken.g:182:9: ( '~' )
+            // dd/grammar/ECAToken.g:182:11: '~'
             {
             match('~'); 
 
@@ -1519,41 +1566,41 @@
     public final void mMUL() throws RecognitionException {
         try {
             int _type = MUL;
-            // dd/grammar/ECAToken.g:184:5: ( '*' | 'TIMES' | 'times' )
-            int alt20=3;
+            // dd/grammar/ECAToken.g:187:5: ( '*' | 'TIMES' | 'times' )
+            int alt21=3;
             switch ( input.LA(1) ) {
             case '*':
                 {
-                alt20=1;
+                alt21=1;
                 }
                 break;
             case 'T':
                 {
-                alt20=2;
+                alt21=2;
                 }
                 break;
             case 't':
                 {
-                alt20=3;
+                alt21=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("184:1: MUL : ( '*' | 'TIMES' | 'times' );", 20, 0, input);
+                    new NoViableAltException("187:1: MUL : ( '*' | 'TIMES' | 'times' );", 21, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt20) {
+            switch (alt21) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:184:7: '*'
+                    // dd/grammar/ECAToken.g:187:7: '*'
                     {
                     match('*'); 
 
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:185:4: 'TIMES'
+                    // dd/grammar/ECAToken.g:188:4: 'TIMES'
                     {
                     match("TIMES"); 
 
@@ -1561,7 +1608,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:186:4: 'times'
+                    // dd/grammar/ECAToken.g:189:4: 'times'
                     {
                     match("times"); 
 
@@ -1581,41 +1628,41 @@
     public final void mDIV() throws RecognitionException {
         try {
             int _type = DIV;
-            // dd/grammar/ECAToken.g:189:5: ( '/' | 'DIVIDE' | 'divide' )
-            int alt21=3;
+            // dd/grammar/ECAToken.g:192:5: ( '/' | 'DIVIDE' | 'divide' )
+            int alt22=3;
             switch ( input.LA(1) ) {
             case '/':
                 {
-                alt21=1;
+                alt22=1;
                 }
                 break;
             case 'D':
                 {
-                alt21=2;
+                alt22=2;
                 }
                 break;
             case 'd':
                 {
-                alt21=3;
+                alt22=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("189:1: DIV : ( '/' | 'DIVIDE' | 'divide' );", 21, 0, input);
+                    new NoViableAltException("192:1: DIV : ( '/' | 'DIVIDE' | 'divide' );", 22, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt21) {
+            switch (alt22) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:189:7: '/'
+                    // dd/grammar/ECAToken.g:192:7: '/'
                     {
                     match('/'); 
 
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:190:4: 'DIVIDE'
+                    // dd/grammar/ECAToken.g:193:4: 'DIVIDE'
                     {
                     match("DIVIDE"); 
 
@@ -1623,7 +1670,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:191:4: 'divide'
+                    // dd/grammar/ECAToken.g:194:4: 'divide'
                     {
                     match("divide"); 
 
@@ -1643,41 +1690,41 @@
     public final void mPLUS() throws RecognitionException {
         try {
             int _type = PLUS;
-            // dd/grammar/ECAToken.g:194:6: ( '+' | 'PLUS' | 'plus' )
-            int alt22=3;
+            // dd/grammar/ECAToken.g:197:6: ( '+' | 'PLUS' | 'plus' )
+            int alt23=3;
             switch ( input.LA(1) ) {
             case '+':
                 {
-                alt22=1;
+                alt23=1;
                 }
                 break;
             case 'P':
                 {
-                alt22=2;
+                alt23=2;
                 }
                 break;
             case 'p':
                 {
-                alt22=3;
+                alt23=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("194:1: PLUS : ( '+' | 'PLUS' | 'plus' );", 22, 0, input);
+                    new NoViableAltException("197:1: PLUS : ( '+' | 'PLUS' | 'plus' );", 23, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt22) {
+            switch (alt23) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:194:8: '+'
+                    // dd/grammar/ECAToken.g:197:8: '+'
                     {
                     match('+'); 
 
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:195:4: 'PLUS'
+                    // dd/grammar/ECAToken.g:198:4: 'PLUS'
                     {
                     match("PLUS"); 
 
@@ -1685,7 +1732,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:196:4: 'plus'
+                    // dd/grammar/ECAToken.g:199:4: 'plus'
                     {
                     match("plus"); 
 
@@ -1705,41 +1752,41 @@
     public final void mMINUS() throws RecognitionException {
         try {
             int _type = MINUS;
-            // dd/grammar/ECAToken.g:199:7: ( '-' | 'MINUS' | 'minus' )
-            int alt23=3;
+            // dd/grammar/ECAToken.g:202:7: ( '-' | 'MINUS' | 'minus' )
+            int alt24=3;
             switch ( input.LA(1) ) {
             case '-':
                 {
-                alt23=1;
+                alt24=1;
                 }
                 break;
             case 'M':
                 {
-                alt23=2;
+                alt24=2;
                 }
                 break;
             case 'm':
                 {
-                alt23=3;
+                alt24=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("199:1: MINUS : ( '-' | 'MINUS' | 'minus' );", 23, 0, input);
+                    new NoViableAltException("202:1: MINUS : ( '-' | 'MINUS' | 'minus' );", 24, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt23) {
+            switch (alt24) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:199:9: '-'
+                    // dd/grammar/ECAToken.g:202:9: '-'
                     {
                     match('-'); 
 
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:200:4: 'MINUS'
+                    // dd/grammar/ECAToken.g:203:4: 'MINUS'
                     {
                     match("MINUS"); 
 
@@ -1747,7 +1794,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:201:4: 'minus'
+                    // dd/grammar/ECAToken.g:204:4: 'minus'
                     {
                     match("minus"); 
 
@@ -1767,41 +1814,41 @@
     public final void mMOD() throws RecognitionException {
         try {
             int _type = MOD;
-            // dd/grammar/ECAToken.g:204:5: ( '%' | 'MOD' | 'mod' )
-            int alt24=3;
+            // dd/grammar/ECAToken.g:207:5: ( '%' | 'MOD' | 'mod' )
+            int alt25=3;
             switch ( input.LA(1) ) {
             case '%':
                 {
-                alt24=1;
+                alt25=1;
                 }
                 break;
             case 'M':
                 {
-                alt24=2;
+                alt25=2;
                 }
                 break;
             case 'm':
                 {
-                alt24=3;
+                alt25=3;
                 }
                 break;
             default:
                 NoViableAltException nvae =
-                    new NoViableAltException("204:1: MOD : ( '%' | 'MOD' | 'mod' );", 24, 0, input);
+                    new NoViableAltException("207:1: MOD : ( '%' | 'MOD' | 'mod' );", 25, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt24) {
+            switch (alt25) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:204:7: '%'
+                    // dd/grammar/ECAToken.g:207:7: '%'
                     {
                     match('%'); 
 
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:205:4: 'MOD'
+                    // dd/grammar/ECAToken.g:208:4: 'MOD'
                     {
                     match("MOD"); 
 
@@ -1809,7 +1856,7 @@
                     }
                     break;
                 case 3 :
-                    // dd/grammar/ECAToken.g:206:4: 'mod'
+                    // dd/grammar/ECAToken.g:209:4: 'mod'
                     {
                     match("mod"); 
 
@@ -1829,8 +1876,8 @@
     public final void mTERN_IF() throws RecognitionException {
         try {
             int _type = TERN_IF;
-            // dd/grammar/ECAToken.g:211:9: ( '?' )
-            // dd/grammar/ECAToken.g:211:11: '?'
+            // dd/grammar/ECAToken.g:214:9: ( '?' )
+            // dd/grammar/ECAToken.g:214:11: '?'
             {
             match('?'); 
 
@@ -1847,8 +1894,8 @@
     public final void mCOLON() throws RecognitionException {
         try {
             int _type = COLON;
-            // dd/grammar/ECAToken.g:214:7: ( ':' )
-            // dd/grammar/ECAToken.g:214:9: ':'
+            // dd/grammar/ECAToken.g:217:7: ( ':' )
+            // dd/grammar/ECAToken.g:217:9: ':'
             {
             match(':'); 
 
@@ -1864,7 +1911,7 @@
     // $ANTLR start LETTER
     public final void mLETTER() throws RecognitionException {
         try {
-            // dd/grammar/ECAToken.g:220:8: ( 'a' .. 'z' | 'A' .. 'Z' )
+            // dd/grammar/ECAToken.g:223:8: ( 'a' .. 'z' | 'A' .. 'Z' )
             // dd/grammar/ECAToken.g:
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||(input.LA(1)>='a' && input.LA(1)<='z') ) {
@@ -1889,8 +1936,8 @@
     // $ANTLR start UNDERSCORE
     public final void mUNDERSCORE() throws RecognitionException {
         try {
-            // dd/grammar/ECAToken.g:224:12: ( '_' )
-            // dd/grammar/ECAToken.g:224:14: '_'
+            // dd/grammar/ECAToken.g:227:12: ( '_' )
+            // dd/grammar/ECAToken.g:227:14: '_'
             {
             match('_'); 
 
@@ -1906,8 +1953,8 @@
     public final void mQUOTE() throws RecognitionException {
         try {
             int _type = QUOTE;
-            // dd/grammar/ECAToken.g:227:7: ( '\\'' )
-            // dd/grammar/ECAToken.g:227:9: '\\''
+            // dd/grammar/ECAToken.g:230:7: ( '\\'' )
+            // dd/grammar/ECAToken.g:230:9: '\\''
             {
             match('\''); 
 
@@ -1924,8 +1971,8 @@
     public final void mDQUOTE() throws RecognitionException {
         try {
             int _type = DQUOTE;
-            // dd/grammar/ECAToken.g:230:8: ( '\"' )
-            // dd/grammar/ECAToken.g:230:10: '\"'
+            // dd/grammar/ECAToken.g:233:8: ( '\"' )
+            // dd/grammar/ECAToken.g:233:10: '\"'
             {
             match('\"'); 
 
@@ -1941,7 +1988,7 @@
     // $ANTLR start SPACE
     public final void mSPACE() throws RecognitionException {
         try {
-            // dd/grammar/ECAToken.g:234:7: ( ' ' | '\\t' | '\\r' )
+            // dd/grammar/ECAToken.g:237:7: ( ' ' | '\\t' | '\\r' )
             // dd/grammar/ECAToken.g:
             {
             if ( input.LA(1)=='\t'||input.LA(1)=='\r'||input.LA(1)==' ' ) {
@@ -1966,8 +2013,8 @@
     // $ANTLR start NEWLINE
     public final void mNEWLINE() throws RecognitionException {
         try {
-            // dd/grammar/ECAToken.g:238:9: ( '\\n' )
-            // dd/grammar/ECAToken.g:238:11: '\\n'
+            // dd/grammar/ECAToken.g:241:9: ( '\\n' )
+            // dd/grammar/ECAToken.g:241:11: '\\n'
             {
             match('\n'); 
 
@@ -1982,7 +2029,7 @@
     // $ANTLR start PUNCT
     public final void mPUNCT() throws RecognitionException {
         try {
-            // dd/grammar/ECAToken.g:242:7: ( '!' | '$' | '%' | '^' | '&' | '*' | '(' | ')' | '-' | '+' | '=' | '{' | '}' | '[' | ']' | ':' | ';' | '@' | '~' | '#' | '|' | '\\\\' | '`' | ',' | '<' | '.' | '>' | '/' | '?' )
+            // dd/grammar/ECAToken.g:245:7: ( '!' | '$' | '%' | '^' | '&' | '*' | '(' | ')' | '-' | '+' | '=' | '{' | '}' | '[' | ']' | ':' | ';' | '@' | '~' | '#' | '|' | '\\\\' | '`' | ',' | '<' | '.' | '>' | '/' | '?' )
             // dd/grammar/ECAToken.g:
             {
             if ( input.LA(1)=='!'||(input.LA(1)>='#' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='/')||(input.LA(1)>=':' && input.LA(1)<='@')||(input.LA(1)>='[' && input.LA(1)<='^')||input.LA(1)=='`'||(input.LA(1)>='{' && input.LA(1)<='~') ) {
@@ -2008,22 +2055,22 @@
     public final void mSTRING() throws RecognitionException {
         try {
             int _type = STRING;
-            // dd/grammar/ECAToken.g:245:8: ( DQUOTE ( SPACE | PUNCT | LETTER | UNDERSCORE | DIGIT | QUOTE )* DQUOTE )
-            // dd/grammar/ECAToken.g:245:10: DQUOTE ( SPACE | PUNCT | LETTER | UNDERSCORE | DIGIT | QUOTE )* DQUOTE
+            // dd/grammar/ECAToken.g:248:8: ( DQUOTE ( SPACE | PUNCT | LETTER | UNDERSCORE | DIGIT | QUOTE )* DQUOTE )
+            // dd/grammar/ECAToken.g:248:10: DQUOTE ( SPACE | PUNCT | LETTER | UNDERSCORE | DIGIT | QUOTE )* DQUOTE
             {
             mDQUOTE(); 
-            // dd/grammar/ECAToken.g:245:17: ( SPACE | PUNCT | LETTER | UNDERSCORE | DIGIT | QUOTE )*
-            loop25:
+            // dd/grammar/ECAToken.g:248:17: ( SPACE | PUNCT | LETTER | UNDERSCORE | DIGIT | QUOTE )*
+            loop26:
             do {
-                int alt25=2;
-                int LA25_0 = input.LA(1);
+                int alt26=2;
+                int LA26_0 = input.LA(1);
 
-                if ( (LA25_0=='\t'||LA25_0=='\r'||(LA25_0>=' ' && LA25_0<='!')||(LA25_0>='#' && LA25_0<='~')) ) {
-                    alt25=1;
+                if ( (LA26_0=='\t'||LA26_0=='\r'||(LA26_0>=' ' && LA26_0<='!')||(LA26_0>='#' && LA26_0<='~')) ) {
+                    alt26=1;
                 }
 
 
-                switch (alt25) {
+                switch (alt26) {
             	case 1 :
             	    // dd/grammar/ECAToken.g:
             	    {
@@ -2042,7 +2089,7 @@
             	    break;
 
             	default :
-            	    break loop25;
+            	    break loop26;
                 }
             } while (true);
 
@@ -2060,8 +2107,8 @@
     // $ANTLR start BARESYM
     public final void mBARESYM() throws RecognitionException {
         try {
-            // dd/grammar/ECAToken.g:249:9: ( ( LETTER | UNDERSCORE ) ( LETTER | DIGIT | UNDERSCORE )* )
-            // dd/grammar/ECAToken.g:249:11: ( LETTER | UNDERSCORE ) ( LETTER | DIGIT | UNDERSCORE )*
+            // dd/grammar/ECAToken.g:252:9: ( ( LETTER | UNDERSCORE ) ( LETTER | DIGIT | UNDERSCORE )* )
+            // dd/grammar/ECAToken.g:252:11: ( LETTER | UNDERSCORE ) ( LETTER | DIGIT | UNDERSCORE )*
             {
             if ( (input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
                 input.consume();
@@ -2073,18 +2120,18 @@
                 recover(mse);    throw mse;
             }
 
-            // dd/grammar/ECAToken.g:249:33: ( LETTER | DIGIT | UNDERSCORE )*
-            loop26:
+            // dd/grammar/ECAToken.g:252:33: ( LETTER | DIGIT | UNDERSCORE )*
+            loop27:
             do {
-                int alt26=2;
-                int LA26_0 = input.LA(1);
+                int alt27=2;
+                int LA27_0 = input.LA(1);
 
-                if ( ((LA26_0>='0' && LA26_0<='9')||(LA26_0>='A' && LA26_0<='Z')||LA26_0=='_'||(LA26_0>='a' && LA26_0<='z')) ) {
-                    alt26=1;
+                if ( ((LA27_0>='0' && LA27_0<='9')||(LA27_0>='A' && LA27_0<='Z')||LA27_0=='_'||(LA27_0>='a' && LA27_0<='z')) ) {
+                    alt27=1;
                 }
 
 
-                switch (alt26) {
+                switch (alt27) {
             	case 1 :
             	    // dd/grammar/ECAToken.g:
             	    {
@@ -2103,7 +2150,7 @@
             	    break;
 
             	default :
-            	    break loop26;
+            	    break loop27;
                 }
             } while (true);
 
@@ -2119,22 +2166,22 @@
     // $ANTLR start QUOTSYM
     public final void mQUOTSYM() throws RecognitionException {
         try {
-            // dd/grammar/ECAToken.g:252:9: ( QUOTE ( PUNCT | LETTER | UNDERSCORE | DIGIT | DQUOTE | SPACE )* QUOTE )
-            // dd/grammar/ECAToken.g:252:11: QUOTE ( PUNCT | LETTER | UNDERSCORE | DIGIT | DQUOTE | SPACE )* QUOTE
+            // dd/grammar/ECAToken.g:255:9: ( QUOTE ( PUNCT | LETTER | UNDERSCORE | DIGIT | DQUOTE | SPACE )* QUOTE )
+            // dd/grammar/ECAToken.g:255:11: QUOTE ( PUNCT | LETTER | UNDERSCORE | DIGIT | DQUOTE | SPACE )* QUOTE
             {
             mQUOTE(); 
-            // dd/grammar/ECAToken.g:252:17: ( PUNCT | LETTER | UNDERSCORE | DIGIT | DQUOTE | SPACE )*
-            loop27:
+            // dd/grammar/ECAToken.g:255:17: ( PUNCT | LETTER | UNDERSCORE | DIGIT | DQUOTE | SPACE )*
+            loop28:
             do {
-                int alt27=2;
-                int LA27_0 = input.LA(1);
+                int alt28=2;
+                int LA28_0 = input.LA(1);
 
-                if ( (LA27_0=='\t'||LA27_0=='\r'||(LA27_0>=' ' && LA27_0<='&')||(LA27_0>='(' && LA27_0<='~')) ) {
-                    alt27=1;
+                if ( (LA28_0=='\t'||LA28_0=='\r'||(LA28_0>=' ' && LA28_0<='&')||(LA28_0>='(' && LA28_0<='~')) ) {
+                    alt28=1;
                 }
 
 
-                switch (alt27) {
+                switch (alt28) {
             	case 1 :
             	    // dd/grammar/ECAToken.g:
             	    {
@@ -2153,7 +2200,7 @@
             	    break;
 
             	default :
-            	    break loop27;
+            	    break loop28;
                 }
             } while (true);
 
@@ -2170,12 +2217,12 @@
     // $ANTLR start DOTSYM
     public final void mDOTSYM() throws RecognitionException {
         try {
-            // dd/grammar/ECAToken.g:257:8: ( BARESYM DOT DOTSYM | BARESYM )
-            int alt28=2;
-            alt28 = dfa28.predict(input);
-            switch (alt28) {
+            // dd/grammar/ECAToken.g:260:8: ( BARESYM DOT DOTSYM | BARESYM )
+            int alt29=2;
+            alt29 = dfa29.predict(input);
+            switch (alt29) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:257:10: BARESYM DOT DOTSYM
+                    // dd/grammar/ECAToken.g:260:10: BARESYM DOT DOTSYM
                     {
                     mBARESYM(); 
                     mDOT(); 
@@ -2184,7 +2231,7 @@
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:258:4: BARESYM
+                    // dd/grammar/ECAToken.g:261:4: BARESYM
                     {
                     mBARESYM(); 
 
@@ -2202,32 +2249,32 @@
     public final void mSYMBOL() throws RecognitionException {
         try {
             int _type = SYMBOL;
-            // dd/grammar/ECAToken.g:261:8: ( DOTSYM | QUOTSYM )
-            int alt29=2;
-            int LA29_0 = input.LA(1);
+            // dd/grammar/ECAToken.g:264:8: ( DOTSYM | QUOTSYM )
+            int alt30=2;
+            int LA30_0 = input.LA(1);
 
-            if ( ((LA29_0>='A' && LA29_0<='Z')||LA29_0=='_'||(LA29_0>='a' && LA29_0<='z')) ) {
-                alt29=1;
+            if ( ((LA30_0>='A' && LA30_0<='Z')||LA30_0=='_'||(LA30_0>='a' && LA30_0<='z')) ) {
+                alt30=1;
             }
-            else if ( (LA29_0=='\'') ) {
-                alt29=2;
+            else if ( (LA30_0=='\'') ) {
+                alt30=2;
             }
             else {
                 NoViableAltException nvae =
-                    new NoViableAltException("261:1: SYMBOL : ( DOTSYM | QUOTSYM );", 29, 0, input);
+                    new NoViableAltException("264:1: SYMBOL : ( DOTSYM | QUOTSYM );", 30, 0, input);
 
                 throw nvae;
             }
-            switch (alt29) {
+            switch (alt30) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:261:10: DOTSYM
+                    // dd/grammar/ECAToken.g:264:10: DOTSYM
                     {
                     mDOTSYM(); 
 
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:262:4: QUOTSYM
+                    // dd/grammar/ECAToken.g:265:4: QUOTSYM
                     {
                     mQUOTSYM(); 
 
@@ -2245,8 +2292,8 @@
     // $ANTLR start DOLLAR
     public final void mDOLLAR() throws RecognitionException {
         try {
-            // dd/grammar/ECAToken.g:267:8: ( '$' )
-            // dd/grammar/ECAToken.g:267:10: '$'
+            // dd/grammar/ECAToken.g:270:8: ( '$' )
+            // dd/grammar/ECAToken.g:270:10: '$'
             {
             match('$'); 
 
@@ -2262,36 +2309,36 @@
     public final void mDOLLARSYM() throws RecognitionException {
         try {
             int _type = DOLLARSYM;
-            // dd/grammar/ECAToken.g:272:11: ( DOLLAR ( BAREINT | BARESYM ) )
-            // dd/grammar/ECAToken.g:272:13: DOLLAR ( BAREINT | BARESYM )
+            // dd/grammar/ECAToken.g:275:11: ( DOLLAR ( BAREINT | BARESYM ) )
+            // dd/grammar/ECAToken.g:275:13: DOLLAR ( BAREINT | BARESYM )
             {
             mDOLLAR(); 
-            // dd/grammar/ECAToken.g:272:20: ( BAREINT | BARESYM )
-            int alt30=2;
-            int LA30_0 = input.LA(1);
+            // dd/grammar/ECAToken.g:275:20: ( BAREINT | BARESYM )
+            int alt31=2;
+            int LA31_0 = input.LA(1);
 
-            if ( ((LA30_0>='0' && LA30_0<='9')) ) {
-                alt30=1;
+            if ( ((LA31_0>='0' && LA31_0<='9')) ) {
+                alt31=1;
             }
-            else if ( ((LA30_0>='A' && LA30_0<='Z')||LA30_0=='_'||(LA30_0>='a' && LA30_0<='z')) ) {
-                alt30=2;
+            else if ( ((LA31_0>='A' && LA31_0<='Z')||LA31_0=='_'||(LA31_0>='a' && LA31_0<='z')) ) {
+                alt31=2;
             }
             else {
                 NoViableAltException nvae =
-                    new NoViableAltException("272:20: ( BAREINT | BARESYM )", 30, 0, input);
+                    new NoViableAltException("275:20: ( BAREINT | BARESYM )", 31, 0, input);
 
                 throw nvae;
             }
-            switch (alt30) {
+            switch (alt31) {
                 case 1 :
-                    // dd/grammar/ECAToken.g:272:21: BAREINT
+                    // dd/grammar/ECAToken.g:275:21: BAREINT
                     {
                     mBAREINT(); 
 
                     }
                     break;
                 case 2 :
-                    // dd/grammar/ECAToken.g:272:31: BARESYM
+                    // dd/grammar/ECAToken.g:275:31: BARESYM
                     {
                     mBARESYM(); 
 
@@ -2314,8 +2361,8 @@
     public final void mWS() throws RecognitionException {
         try {
             int _type = WS;
-            // dd/grammar/ECAToken.g:278:4: ( ( SPACE | NEWLINE ) )
-            // dd/grammar/ECAToken.g:278:6: ( SPACE | NEWLINE )
+            // dd/grammar/ECAToken.g:281:4: ( ( SPACE | NEWLINE ) )
+            // dd/grammar/ECAToken.g:281:6: ( SPACE | NEWLINE )
             {
             if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
                 input.consume();
@@ -2339,18 +2386,18 @@
     // $ANTLR end WS
 
     public void mTokens() throws RecognitionException {
-        // dd/grammar/ECAToken.g:1:8: ( NUMBER | BIND | IF | DO | RULE | CLASS | METHOD | LINE | ENDRULE | NOTHING | TRUE | FALSE | RETURN | LPAREN | RPAREN | LSQUARE | RSQUARE | LBRACE | RBRACE | SEPR | DOT | ASSIGN | OR | AND | NOT | EQ | NEQ | GT | LT | GEQ | LEQ | BOR | BAND | BXOR | TWIDDLE | MUL | DIV | PLUS | MINUS | MOD | TERN_IF | COLON | QUOTE | DQUOTE | STRING | SYMBOL | DOLLARSYM | WS )
-        int alt31=48;
+        // dd/grammar/ECAToken.g:1:8: ( NUMBER | BIND | IF | DO | RULE | CLASS | METHOD | LINE | ENDRULE | NOTHING | TRUE | FALSE | RETURN | THROW | LPAREN | RPAREN | LSQUARE | RSQUARE | LBRACE | RBRACE | SEPR | DOT | ASSIGN | OR | AND | NOT | EQ | NEQ | GT | LT | GEQ | LEQ | BOR | BAND | BXOR | TWIDDLE | MUL | DIV | PLUS | MINUS | MOD | TERN_IF | COLON | QUOTE | DQUOTE | STRING | SYMBOL | DOLLARSYM | WS )
+        int alt32=49;
         switch ( input.LA(1) ) {
         case '+':
             {
-            int LA31_1 = input.LA(2);
+            int LA32_1 = input.LA(2);
 
-            if ( ((LA31_1>='0' && LA31_1<='9')) ) {
-                alt31=1;
+            if ( ((LA32_1>='0' && LA32_1<='9')) ) {
+                alt32=1;
             }
             else {
-                alt31=38;}
+                alt32=39;}
             }
             break;
         case '0':
@@ -2364,53 +2411,53 @@
         case '8':
         case '9':
             {
-            alt31=1;
+            alt32=1;
             }
             break;
         case 'B':
             {
-            int LA31_3 = input.LA(2);
+            int LA32_3 = input.LA(2);
 
-            if ( (LA31_3=='I') ) {
-                int LA31_58 = input.LA(3);
+            if ( (LA32_3=='I') ) {
+                int LA32_58 = input.LA(3);
 
-                if ( (LA31_58=='N') ) {
-                    int LA31_115 = input.LA(4);
+                if ( (LA32_58=='N') ) {
+                    int LA32_117 = input.LA(4);
 
-                    if ( (LA31_115=='D') ) {
-                        int LA31_148 = input.LA(5);
+                    if ( (LA32_117=='D') ) {
+                        int LA32_152 = input.LA(5);
 
-                        if ( (LA31_148=='.'||(LA31_148>='0' && LA31_148<='9')||(LA31_148>='A' && LA31_148<='Z')||LA31_148=='_'||(LA31_148>='a' && LA31_148<='z')) ) {
-                            alt31=46;
+                        if ( (LA32_152=='.'||(LA32_152>='0' && LA32_152<='9')||(LA32_152>='A' && LA32_152<='Z')||LA32_152=='_'||(LA32_152>='a' && LA32_152<='z')) ) {
+                            alt32=47;
                         }
                         else {
-                            alt31=2;}
+                            alt32=2;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case 'I':
             {
-            int LA31_4 = input.LA(2);
+            int LA32_4 = input.LA(2);
 
-            if ( (LA31_4=='F') ) {
-                int LA31_59 = input.LA(3);
+            if ( (LA32_4=='F') ) {
+                int LA32_59 = input.LA(3);
 
-                if ( (LA31_59=='.'||(LA31_59>='0' && LA31_59<='9')||(LA31_59>='A' && LA31_59<='Z')||LA31_59=='_'||(LA31_59>='a' && LA31_59<='z')) ) {
-                    alt31=46;
+                if ( (LA32_59=='.'||(LA32_59>='0' && LA32_59<='9')||(LA32_59>='A' && LA32_59<='Z')||LA32_59=='_'||(LA32_59>='a' && LA32_59<='z')) ) {
+                    alt32=47;
                 }
                 else {
-                    alt31=3;}
+                    alt32=3;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case 'D':
@@ -2418,52 +2465,52 @@
             switch ( input.LA(2) ) {
             case 'O':
                 {
-                int LA31_60 = input.LA(3);
+                int LA32_60 = input.LA(3);
 
-                if ( (LA31_60=='.'||(LA31_60>='0' && LA31_60<='9')||(LA31_60>='A' && LA31_60<='Z')||LA31_60=='_'||(LA31_60>='a' && LA31_60<='z')) ) {
-                    alt31=46;
+                if ( (LA32_60=='.'||(LA32_60>='0' && LA32_60<='9')||(LA32_60>='A' && LA32_60<='Z')||LA32_60=='_'||(LA32_60>='a' && LA32_60<='z')) ) {
+                    alt32=47;
                 }
                 else {
-                    alt31=4;}
+                    alt32=4;}
                 }
                 break;
             case 'I':
                 {
-                int LA31_61 = input.LA(3);
+                int LA32_61 = input.LA(3);
 
-                if ( (LA31_61=='V') ) {
-                    int LA31_118 = input.LA(4);
+                if ( (LA32_61=='V') ) {
+                    int LA32_120 = input.LA(4);
 
-                    if ( (LA31_118=='I') ) {
-                        int LA31_149 = input.LA(5);
+                    if ( (LA32_120=='I') ) {
+                        int LA32_153 = input.LA(5);
 
-                        if ( (LA31_149=='D') ) {
-                            int LA31_170 = input.LA(6);
+                        if ( (LA32_153=='D') ) {
+                            int LA32_176 = input.LA(6);
 
-                            if ( (LA31_170=='E') ) {
-                                int LA31_187 = input.LA(7);
+                            if ( (LA32_176=='E') ) {
+                                int LA32_195 = input.LA(7);
 
-                                if ( (LA31_187=='.'||(LA31_187>='0' && LA31_187<='9')||(LA31_187>='A' && LA31_187<='Z')||LA31_187=='_'||(LA31_187>='a' && LA31_187<='z')) ) {
-                                    alt31=46;
+                                if ( (LA32_195=='.'||(LA32_195>='0' && LA32_195<='9')||(LA32_195>='A' && LA32_195<='Z')||LA32_195=='_'||(LA32_195>='a' && LA32_195<='z')) ) {
+                                    alt32=47;
                                 }
                                 else {
-                                    alt31=37;}
+                                    alt32=38;}
                             }
                             else {
-                                alt31=46;}
+                                alt32=47;}
                         }
                         else {
-                            alt31=46;}
+                            alt32=47;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
             default:
-                alt31=46;}
+                alt32=47;}
 
             }
             break;
@@ -2472,363 +2519,346 @@
             switch ( input.LA(2) ) {
             case 'U':
                 {
-                int LA31_62 = input.LA(3);
+                int LA32_62 = input.LA(3);
 
-                if ( (LA31_62=='L') ) {
-                    int LA31_119 = input.LA(4);
+                if ( (LA32_62=='L') ) {
+                    int LA32_121 = input.LA(4);
 
-                    if ( (LA31_119=='E') ) {
-                        int LA31_150 = input.LA(5);
+                    if ( (LA32_121=='E') ) {
+                        int LA32_154 = input.LA(5);
 
-                        if ( (LA31_150=='.'||(LA31_150>='0' && LA31_150<='9')||(LA31_150>='A' && LA31_150<='Z')||LA31_150=='_'||(LA31_150>='a' && LA31_150<='z')) ) {
-                            alt31=46;
+                        if ( (LA32_154=='.'||(LA32_154>='0' && LA32_154<='9')||(LA32_154>='A' && LA32_154<='Z')||LA32_154=='_'||(LA32_154>='a' && LA32_154<='z')) ) {
+                            alt32=47;
                         }
                         else {
-                            alt31=5;}
+                            alt32=5;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
             case 'E':
                 {
-                int LA31_63 = input.LA(3);
+                int LA32_63 = input.LA(3);
 
-                if ( (LA31_63=='T') ) {
-                    int LA31_120 = input.LA(4);
+                if ( (LA32_63=='T') ) {
+                    int LA32_122 = input.LA(4);
 
-                    if ( (LA31_120=='U') ) {
-                        int LA31_151 = input.LA(5);
+                    if ( (LA32_122=='U') ) {
+                        int LA32_155 = input.LA(5);
 
-                        if ( (LA31_151=='R') ) {
-                            int LA31_172 = input.LA(6);
+                        if ( (LA32_155=='R') ) {
+                            int LA32_178 = input.LA(6);
 
-                            if ( (LA31_172=='N') ) {
-                                int LA31_188 = input.LA(7);
+                            if ( (LA32_178=='N') ) {
+                                int LA32_196 = input.LA(7);
 
-                                if ( (LA31_188=='.'||(LA31_188>='0' && LA31_188<='9')||(LA31_188>='A' && LA31_188<='Z')||LA31_188=='_'||(LA31_188>='a' && LA31_188<='z')) ) {
-                                    alt31=46;
+                                if ( (LA32_196=='.'||(LA32_196>='0' && LA32_196<='9')||(LA32_196>='A' && LA32_196<='Z')||LA32_196=='_'||(LA32_196>='a' && LA32_196<='z')) ) {
+                                    alt32=47;
                                 }
                                 else {
-                                    alt31=13;}
+                                    alt32=13;}
                             }
                             else {
-                                alt31=46;}
+                                alt32=47;}
                         }
                         else {
-                            alt31=46;}
+                            alt32=47;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
             default:
-                alt31=46;}
+                alt32=47;}
 
             }
             break;
         case 'C':
             {
-            int LA31_7 = input.LA(2);
+            int LA32_7 = input.LA(2);
 
-            if ( (LA31_7=='L') ) {
-                int LA31_64 = input.LA(3);
+            if ( (LA32_7=='L') ) {
+                int LA32_64 = input.LA(3);
 
-                if ( (LA31_64=='A') ) {
-                    int LA31_121 = input.LA(4);
+                if ( (LA32_64=='A') ) {
+                    int LA32_123 = input.LA(4);
 
-                    if ( (LA31_121=='S') ) {
-                        int LA31_152 = input.LA(5);
+                    if ( (LA32_123=='S') ) {
+                        int LA32_156 = input.LA(5);
 
-                        if ( (LA31_152=='S') ) {
-                            int LA31_173 = input.LA(6);
+                        if ( (LA32_156=='S') ) {
+                            int LA32_179 = input.LA(6);
 
-                            if ( (LA31_173=='.'||(LA31_173>='0' && LA31_173<='9')||(LA31_173>='A' && LA31_173<='Z')||LA31_173=='_'||(LA31_173>='a' && LA31_173<='z')) ) {
-                                alt31=46;
+                            if ( (LA32_179=='.'||(LA32_179>='0' && LA32_179<='9')||(LA32_179>='A' && LA32_179<='Z')||LA32_179=='_'||(LA32_179>='a' && LA32_179<='z')) ) {
+                                alt32=47;
                             }
                             else {
-                                alt31=6;}
+                                alt32=6;}
                         }
                         else {
-                            alt31=46;}
+                            alt32=47;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case 'M':
             {
             switch ( input.LA(2) ) {
-            case 'E':
+            case 'I':
                 {
-                int LA31_65 = input.LA(3);
+                int LA32_65 = input.LA(3);
 
-                if ( (LA31_65=='T') ) {
-                    int LA31_122 = input.LA(4);
+                if ( (LA32_65=='N') ) {
+                    int LA32_124 = input.LA(4);
 
-                    if ( (LA31_122=='H') ) {
-                        int LA31_153 = input.LA(5);
+                    if ( (LA32_124=='U') ) {
+                        int LA32_157 = input.LA(5);
 
-                        if ( (LA31_153=='O') ) {
-                            int LA31_174 = input.LA(6);
+                        if ( (LA32_157=='S') ) {
+                            int LA32_180 = input.LA(6);
 
-                            if ( (LA31_174=='D') ) {
-                                int LA31_190 = input.LA(7);
-
-                                if ( (LA31_190=='.'||(LA31_190>='0' && LA31_190<='9')||(LA31_190>='A' && LA31_190<='Z')||LA31_190=='_'||(LA31_190>='a' && LA31_190<='z')) ) {
-                                    alt31=46;
-                                }
-                                else {
-                                    alt31=7;}
+                            if ( (LA32_180=='.'||(LA32_180>='0' && LA32_180<='9')||(LA32_180>='A' && LA32_180<='Z')||LA32_180=='_'||(LA32_180>='a' && LA32_180<='z')) ) {
+                                alt32=47;
                             }
                             else {
-                                alt31=46;}
+                                alt32=40;}
                         }
                         else {
-                            alt31=46;}
+                            alt32=47;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
             case 'O':
                 {
-                int LA31_66 = input.LA(3);
+                int LA32_66 = input.LA(3);
 
-                if ( (LA31_66=='D') ) {
-                    int LA31_123 = input.LA(4);
+                if ( (LA32_66=='D') ) {
+                    int LA32_125 = input.LA(4);
 
-                    if ( (LA31_123=='.'||(LA31_123>='0' && LA31_123<='9')||(LA31_123>='A' && LA31_123<='Z')||LA31_123=='_'||(LA31_123>='a' && LA31_123<='z')) ) {
-                        alt31=46;
+                    if ( (LA32_125=='.'||(LA32_125>='0' && LA32_125<='9')||(LA32_125>='A' && LA32_125<='Z')||LA32_125=='_'||(LA32_125>='a' && LA32_125<='z')) ) {
+                        alt32=47;
                     }
                     else {
-                        alt31=40;}
+                        alt32=41;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
-            case 'I':
+            case 'E':
                 {
-                int LA31_67 = input.LA(3);
+                int LA32_67 = input.LA(3);
 
-                if ( (LA31_67=='N') ) {
-                    int LA31_124 = input.LA(4);
+                if ( (LA32_67=='T') ) {
+                    int LA32_126 = input.LA(4);
 
-                    if ( (LA31_124=='U') ) {
-                        int LA31_154 = input.LA(5);
+                    if ( (LA32_126=='H') ) {
+                        int LA32_158 = input.LA(5);
 
-                        if ( (LA31_154=='S') ) {
-                            int LA31_175 = input.LA(6);
+                        if ( (LA32_158=='O') ) {
+                            int LA32_181 = input.LA(6);
 
-                            if ( (LA31_175=='.'||(LA31_175>='0' && LA31_175<='9')||(LA31_175>='A' && LA31_175<='Z')||LA31_175=='_'||(LA31_175>='a' && LA31_175<='z')) ) {
-                                alt31=46;
+                            if ( (LA32_181=='D') ) {
+                                int LA32_198 = input.LA(7);
+
+                                if ( (LA32_198=='.'||(LA32_198>='0' && LA32_198<='9')||(LA32_198>='A' && LA32_198<='Z')||LA32_198=='_'||(LA32_198>='a' && LA32_198<='z')) ) {
+                                    alt32=47;
+                                }
+                                else {
+                                    alt32=7;}
                             }
                             else {
-                                alt31=39;}
+                                alt32=47;}
                         }
                         else {
-                            alt31=46;}
+                            alt32=47;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
             default:
-                alt31=46;}
+                alt32=47;}
 
             }
             break;
         case 'L':
             {
             switch ( input.LA(2) ) {
-            case 'E':
+            case 'T':
                 {
-                int LA31_68 = input.LA(3);
+                int LA32_68 = input.LA(3);
 
-                if ( (LA31_68=='Q') ) {
-                    int LA31_125 = input.LA(4);
-
-                    if ( (LA31_125=='.'||(LA31_125>='0' && LA31_125<='9')||(LA31_125>='A' && LA31_125<='Z')||LA31_125=='_'||(LA31_125>='a' && LA31_125<='z')) ) {
-                        alt31=46;
-                    }
-                    else {
-                        alt31=31;}
+                if ( (LA32_68=='.'||(LA32_68>='0' && LA32_68<='9')||(LA32_68>='A' && LA32_68<='Z')||LA32_68=='_'||(LA32_68>='a' && LA32_68<='z')) ) {
+                    alt32=47;
                 }
                 else {
-                    alt31=46;}
+                    alt32=30;}
                 }
                 break;
-            case 'T':
+            case 'E':
                 {
-                int LA31_69 = input.LA(3);
+                int LA32_69 = input.LA(3);
 
-                if ( (LA31_69=='.'||(LA31_69>='0' && LA31_69<='9')||(LA31_69>='A' && LA31_69<='Z')||LA31_69=='_'||(LA31_69>='a' && LA31_69<='z')) ) {
-                    alt31=46;
+                if ( (LA32_69=='Q') ) {
+                    int LA32_127 = input.LA(4);
+
+                    if ( (LA32_127=='.'||(LA32_127>='0' && LA32_127<='9')||(LA32_127>='A' && LA32_127<='Z')||LA32_127=='_'||(LA32_127>='a' && LA32_127<='z')) ) {
+                        alt32=47;
+                    }
+                    else {
+                        alt32=32;}
                 }
                 else {
-                    alt31=29;}
+                    alt32=47;}
                 }
                 break;
             case 'I':
                 {
-                int LA31_70 = input.LA(3);
+                int LA32_70 = input.LA(3);
 
-                if ( (LA31_70=='N') ) {
-                    int LA31_126 = input.LA(4);
+                if ( (LA32_70=='N') ) {
+                    int LA32_128 = input.LA(4);
 
-                    if ( (LA31_126=='E') ) {
-                        int LA31_155 = input.LA(5);
+                    if ( (LA32_128=='E') ) {
+                        int LA32_159 = input.LA(5);
 
-                        if ( (LA31_155=='.'||(LA31_155>='0' && LA31_155<='9')||(LA31_155>='A' && LA31_155<='Z')||LA31_155=='_'||(LA31_155>='a' && LA31_155<='z')) ) {
-                            alt31=46;
+                        if ( (LA32_159=='.'||(LA32_159>='0' && LA32_159<='9')||(LA32_159>='A' && LA32_159<='Z')||LA32_159=='_'||(LA32_159>='a' && LA32_159<='z')) ) {
+                            alt32=47;
                         }
                         else {
-                            alt31=8;}
+                            alt32=8;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
             default:
-                alt31=46;}
+                alt32=47;}
 
             }
             break;
         case 'E':
             {
             switch ( input.LA(2) ) {
-            case 'Q':
-                {
-                int LA31_71 = input.LA(3);
-
-                if ( (LA31_71=='.'||(LA31_71>='0' && LA31_71<='9')||(LA31_71>='A' && LA31_71<='Z')||LA31_71=='_'||(LA31_71>='a' && LA31_71<='z')) ) {
-                    alt31=46;
-                }
-                else {
-                    alt31=26;}
-                }
-                break;
             case 'N':
                 {
-                int LA31_72 = input.LA(3);
+                int LA32_71 = input.LA(3);
 
-                if ( (LA31_72=='D') ) {
-                    int LA31_127 = input.LA(4);
+                if ( (LA32_71=='D') ) {
+                    int LA32_129 = input.LA(4);
 
-                    if ( (LA31_127=='R') ) {
-                        int LA31_156 = input.LA(5);
+                    if ( (LA32_129=='R') ) {
+                        int LA32_160 = input.LA(5);
 
-                        if ( (LA31_156=='U') ) {
-                            int LA31_177 = input.LA(6);
+                        if ( (LA32_160=='U') ) {
+                            int LA32_183 = input.LA(6);
 
-                            if ( (LA31_177=='L') ) {
-                                int LA31_191 = input.LA(7);
+                            if ( (LA32_183=='L') ) {
+                                int LA32_199 = input.LA(7);
 
-                                if ( (LA31_191=='E') ) {
-                                    int LA31_198 = input.LA(8);
+                                if ( (LA32_199=='E') ) {
+                                    int LA32_207 = input.LA(8);
 
-                                    if ( (LA31_198=='.'||(LA31_198>='0' && LA31_198<='9')||(LA31_198>='A' && LA31_198<='Z')||LA31_198=='_'||(LA31_198>='a' && LA31_198<='z')) ) {
-                                        alt31=46;
+                                    if ( (LA32_207=='.'||(LA32_207>='0' && LA32_207<='9')||(LA32_207>='A' && LA32_207<='Z')||LA32_207=='_'||(LA32_207>='a' && LA32_207<='z')) ) {
+                                        alt32=47;
                                     }
                                     else {
-                                        alt31=9;}
+                                        alt32=9;}
                                 }
                                 else {
-                                    alt31=46;}
+                                    alt32=47;}
                             }
                             else {
-                                alt31=46;}
+                                alt32=47;}
                         }
                         else {
-                            alt31=46;}
+                            alt32=47;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
+            case 'Q':
+                {
+                int LA32_72 = input.LA(3);
+
+                if ( (LA32_72=='.'||(LA32_72>='0' && LA32_72<='9')||(LA32_72>='A' && LA32_72<='Z')||LA32_72=='_'||(LA32_72>='a' && LA32_72<='z')) ) {
+                    alt32=47;
+                }
+                else {
+                    alt32=27;}
+                }
+                break;
             default:
-                alt31=46;}
+                alt32=47;}
 
             }
             break;
         case 'N':
             {
             switch ( input.LA(2) ) {
-            case 'E':
-                {
-                int LA31_73 = input.LA(3);
-
-                if ( (LA31_73=='Q') ) {
-                    int LA31_128 = input.LA(4);
-
-                    if ( (LA31_128=='.'||(LA31_128>='0' && LA31_128<='9')||(LA31_128>='A' && LA31_128<='Z')||LA31_128=='_'||(LA31_128>='a' && LA31_128<='z')) ) {
-                        alt31=46;
-                    }
-                    else {
-                        alt31=27;}
-                }
-                else {
-                    alt31=46;}
-                }
-                break;
             case 'O':
                 {
-                int LA31_74 = input.LA(3);
+                int LA32_73 = input.LA(3);
 
-                if ( (LA31_74=='T') ) {
+                if ( (LA32_73=='T') ) {
                     switch ( input.LA(4) ) {
                     case 'H':
                         {
-                        int LA31_157 = input.LA(5);
+                        int LA32_161 = input.LA(5);
 
-                        if ( (LA31_157=='I') ) {
-                            int LA31_178 = input.LA(6);
+                        if ( (LA32_161=='I') ) {
+                            int LA32_184 = input.LA(6);
 
-                            if ( (LA31_178=='N') ) {
-                                int LA31_192 = input.LA(7);
+                            if ( (LA32_184=='N') ) {
+                                int LA32_200 = input.LA(7);
 
-                                if ( (LA31_192=='G') ) {
-                                    int LA31_199 = input.LA(8);
+                                if ( (LA32_200=='G') ) {
+                                    int LA32_208 = input.LA(8);
 
-                                    if ( (LA31_199=='.'||(LA31_199>='0' && LA31_199<='9')||(LA31_199>='A' && LA31_199<='Z')||LA31_199=='_'||(LA31_199>='a' && LA31_199<='z')) ) {
-                                        alt31=46;
+                                    if ( (LA32_208=='.'||(LA32_208>='0' && LA32_208<='9')||(LA32_208>='A' && LA32_208<='Z')||LA32_208=='_'||(LA32_208>='a' && LA32_208<='z')) ) {
+                                        alt32=47;
                                     }
                                     else {
-                                        alt31=10;}
+                                        alt32=10;}
                                 }
                                 else {
-                                    alt31=46;}
+                                    alt32=47;}
                             }
                             else {
-                                alt31=46;}
+                                alt32=47;}
                         }
                         else {
-                            alt31=46;}
+                            alt32=47;}
                         }
                         break;
                     case '.':
@@ -2895,19 +2925,36 @@
                     case 'y':
                     case 'z':
                         {
-                        alt31=46;
+                        alt32=47;
                         }
                         break;
                     default:
-                        alt31=25;}
+                        alt32=26;}
 
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
+            case 'E':
+                {
+                int LA32_74 = input.LA(3);
+
+                if ( (LA32_74=='Q') ) {
+                    int LA32_131 = input.LA(4);
+
+                    if ( (LA32_131=='.'||(LA32_131>='0' && LA32_131<='9')||(LA32_131>='A' && LA32_131<='Z')||LA32_131=='_'||(LA32_131>='a' && LA32_131<='z')) ) {
+                        alt32=47;
+                    }
+                    else {
+                        alt32=28;}
+                }
+                else {
+                    alt32=47;}
+                }
+                break;
             default:
-                alt31=46;}
+                alt32=47;}
 
             }
             break;
@@ -2916,282 +2963,340 @@
             switch ( input.LA(2) ) {
             case 'R':
                 {
-                int LA31_75 = input.LA(3);
+                int LA32_75 = input.LA(3);
 
-                if ( (LA31_75=='U') ) {
-                    int LA31_130 = input.LA(4);
+                if ( (LA32_75=='U') ) {
+                    int LA32_132 = input.LA(4);
 
-                    if ( (LA31_130=='E') ) {
-                        int LA31_158 = input.LA(5);
+                    if ( (LA32_132=='E') ) {
+                        int LA32_162 = input.LA(5);
 
-                        if ( (LA31_158=='.'||(LA31_158>='0' && LA31_158<='9')||(LA31_158>='A' && LA31_158<='Z')||LA31_158=='_'||(LA31_158>='a' && LA31_158<='z')) ) {
-                            alt31=46;
+                        if ( (LA32_162=='.'||(LA32_162>='0' && LA32_162<='9')||(LA32_162>='A' && LA32_162<='Z')||LA32_162=='_'||(LA32_162>='a' && LA32_162<='z')) ) {
+                            alt32=47;
                         }
                         else {
-                            alt31=11;}
+                            alt32=11;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
+            case 'H':
+                {
+                int LA32_76 = input.LA(3);
+
+                if ( (LA32_76=='R') ) {
+                    int LA32_133 = input.LA(4);
+
+                    if ( (LA32_133=='O') ) {
+                        int LA32_163 = input.LA(5);
+
+                        if ( (LA32_163=='W') ) {
+                            int LA32_186 = input.LA(6);
+
+                            if ( (LA32_186=='.'||(LA32_186>='0' && LA32_186<='9')||(LA32_186>='A' && LA32_186<='Z')||LA32_186=='_'||(LA32_186>='a' && LA32_186<='z')) ) {
+                                alt32=47;
+                            }
+                            else {
+                                alt32=14;}
+                        }
+                        else {
+                            alt32=47;}
+                    }
+                    else {
+                        alt32=47;}
+                }
+                else {
+                    alt32=47;}
+                }
+                break;
             case 'I':
                 {
-                int LA31_76 = input.LA(3);
+                int LA32_77 = input.LA(3);
 
-                if ( (LA31_76=='M') ) {
-                    int LA31_131 = input.LA(4);
+                if ( (LA32_77=='M') ) {
+                    int LA32_134 = input.LA(4);
 
-                    if ( (LA31_131=='E') ) {
-                        int LA31_159 = input.LA(5);
+                    if ( (LA32_134=='E') ) {
+                        int LA32_164 = input.LA(5);
 
-                        if ( (LA31_159=='S') ) {
-                            int LA31_180 = input.LA(6);
+                        if ( (LA32_164=='S') ) {
+                            int LA32_187 = input.LA(6);
 
-                            if ( (LA31_180=='.'||(LA31_180>='0' && LA31_180<='9')||(LA31_180>='A' && LA31_180<='Z')||LA31_180=='_'||(LA31_180>='a' && LA31_180<='z')) ) {
-                                alt31=46;
+                            if ( (LA32_187=='.'||(LA32_187>='0' && LA32_187<='9')||(LA32_187>='A' && LA32_187<='Z')||LA32_187=='_'||(LA32_187>='a' && LA32_187<='z')) ) {
+                                alt32=47;
                             }
                             else {
-                                alt31=36;}
+                                alt32=37;}
                         }
                         else {
-                            alt31=46;}
+                            alt32=47;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
             default:
-                alt31=46;}
+                alt32=47;}
 
             }
             break;
         case 't':
             {
             switch ( input.LA(2) ) {
+            case 'r':
+                {
+                int LA32_78 = input.LA(3);
+
+                if ( (LA32_78=='u') ) {
+                    int LA32_135 = input.LA(4);
+
+                    if ( (LA32_135=='e') ) {
+                        int LA32_165 = input.LA(5);
+
+                        if ( (LA32_165=='.'||(LA32_165>='0' && LA32_165<='9')||(LA32_165>='A' && LA32_165<='Z')||LA32_165=='_'||(LA32_165>='a' && LA32_165<='z')) ) {
+                            alt32=47;
+                        }
+                        else {
+                            alt32=11;}
+                    }
+                    else {
+                        alt32=47;}
+                }
+                else {
+                    alt32=47;}
+                }
+                break;
             case 'i':
                 {
-                int LA31_77 = input.LA(3);
+                int LA32_79 = input.LA(3);
 
-                if ( (LA31_77=='m') ) {
-                    int LA31_132 = input.LA(4);
+                if ( (LA32_79=='m') ) {
+                    int LA32_136 = input.LA(4);
 
-                    if ( (LA31_132=='e') ) {
-                        int LA31_160 = input.LA(5);
+                    if ( (LA32_136=='e') ) {
+                        int LA32_166 = input.LA(5);
 
-                        if ( (LA31_160=='s') ) {
-                            int LA31_181 = input.LA(6);
+                        if ( (LA32_166=='s') ) {
+                            int LA32_188 = input.LA(6);
 
-                            if ( (LA31_181=='.'||(LA31_181>='0' && LA31_181<='9')||(LA31_181>='A' && LA31_181<='Z')||LA31_181=='_'||(LA31_181>='a' && LA31_181<='z')) ) {
-                                alt31=46;
+                            if ( (LA32_188=='.'||(LA32_188>='0' && LA32_188<='9')||(LA32_188>='A' && LA32_188<='Z')||LA32_188=='_'||(LA32_188>='a' && LA32_188<='z')) ) {
+                                alt32=47;
                             }
                             else {
-                                alt31=36;}
+                                alt32=37;}
                         }
                         else {
-                            alt31=46;}
+                            alt32=47;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
-            case 'r':
+            case 'h':
                 {
-                int LA31_78 = input.LA(3);
+                int LA32_80 = input.LA(3);
 
-                if ( (LA31_78=='u') ) {
-                    int LA31_133 = input.LA(4);
+                if ( (LA32_80=='r') ) {
+                    int LA32_137 = input.LA(4);
 
-                    if ( (LA31_133=='e') ) {
-                        int LA31_161 = input.LA(5);
+                    if ( (LA32_137=='o') ) {
+                        int LA32_167 = input.LA(5);
 
-                        if ( (LA31_161=='.'||(LA31_161>='0' && LA31_161<='9')||(LA31_161>='A' && LA31_161<='Z')||LA31_161=='_'||(LA31_161>='a' && LA31_161<='z')) ) {
-                            alt31=46;
+                        if ( (LA32_167=='w') ) {
+                            int LA32_189 = input.LA(6);
+
+                            if ( (LA32_189=='.'||(LA32_189>='0' && LA32_189<='9')||(LA32_189>='A' && LA32_189<='Z')||LA32_189=='_'||(LA32_189>='a' && LA32_189<='z')) ) {
+                                alt32=47;
+                            }
+                            else {
+                                alt32=14;}
                         }
                         else {
-                            alt31=11;}
+                            alt32=47;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
             default:
-                alt31=46;}
+                alt32=47;}
 
             }
             break;
         case 'F':
             {
-            int LA31_14 = input.LA(2);
+            int LA32_14 = input.LA(2);
 
-            if ( (LA31_14=='A') ) {
-                int LA31_79 = input.LA(3);
+            if ( (LA32_14=='A') ) {
+                int LA32_81 = input.LA(3);
 
-                if ( (LA31_79=='L') ) {
-                    int LA31_134 = input.LA(4);
+                if ( (LA32_81=='L') ) {
+                    int LA32_138 = input.LA(4);
 
-                    if ( (LA31_134=='S') ) {
-                        int LA31_162 = input.LA(5);
+                    if ( (LA32_138=='S') ) {
+                        int LA32_168 = input.LA(5);
 
-                        if ( (LA31_162=='E') ) {
-                            int LA31_182 = input.LA(6);
+                        if ( (LA32_168=='E') ) {
+                            int LA32_190 = input.LA(6);
 
-                            if ( (LA31_182=='.'||(LA31_182>='0' && LA31_182<='9')||(LA31_182>='A' && LA31_182<='Z')||LA31_182=='_'||(LA31_182>='a' && LA31_182<='z')) ) {
-                                alt31=46;
+                            if ( (LA32_190=='.'||(LA32_190>='0' && LA32_190<='9')||(LA32_190>='A' && LA32_190<='Z')||LA32_190=='_'||(LA32_190>='a' && LA32_190<='z')) ) {
+                                alt32=47;
                             }
                             else {
-                                alt31=12;}
+                                alt32=12;}
                         }
                         else {
-                            alt31=46;}
+                            alt32=47;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case 'f':
             {
-            int LA31_15 = input.LA(2);
+            int LA32_15 = input.LA(2);
 
-            if ( (LA31_15=='a') ) {
-                int LA31_80 = input.LA(3);
+            if ( (LA32_15=='a') ) {
+                int LA32_82 = input.LA(3);
 
-                if ( (LA31_80=='l') ) {
-                    int LA31_135 = input.LA(4);
+                if ( (LA32_82=='l') ) {
+                    int LA32_139 = input.LA(4);
 
-                    if ( (LA31_135=='s') ) {
-                        int LA31_163 = input.LA(5);
+                    if ( (LA32_139=='s') ) {
+                        int LA32_169 = input.LA(5);
 
-                        if ( (LA31_163=='e') ) {
-                            int LA31_183 = input.LA(6);
+                        if ( (LA32_169=='e') ) {
+                            int LA32_191 = input.LA(6);
 
-                            if ( (LA31_183=='.'||(LA31_183>='0' && LA31_183<='9')||(LA31_183>='A' && LA31_183<='Z')||LA31_183=='_'||(LA31_183>='a' && LA31_183<='z')) ) {
-                                alt31=46;
+                            if ( (LA32_191=='.'||(LA32_191>='0' && LA32_191<='9')||(LA32_191>='A' && LA32_191<='Z')||LA32_191=='_'||(LA32_191>='a' && LA32_191<='z')) ) {
+                                alt32=47;
                             }
                             else {
-                                alt31=12;}
+                                alt32=12;}
                         }
                         else {
-                            alt31=46;}
+                            alt32=47;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case 'r':
             {
-            int LA31_16 = input.LA(2);
+            int LA32_16 = input.LA(2);
 
-            if ( (LA31_16=='e') ) {
-                int LA31_81 = input.LA(3);
+            if ( (LA32_16=='e') ) {
+                int LA32_83 = input.LA(3);
 
-                if ( (LA31_81=='t') ) {
-                    int LA31_136 = input.LA(4);
+                if ( (LA32_83=='t') ) {
+                    int LA32_140 = input.LA(4);
 
-                    if ( (LA31_136=='u') ) {
-                        int LA31_164 = input.LA(5);
+                    if ( (LA32_140=='u') ) {
+                        int LA32_170 = input.LA(5);
 
-                        if ( (LA31_164=='r') ) {
-                            int LA31_184 = input.LA(6);
+                        if ( (LA32_170=='r') ) {
+                            int LA32_192 = input.LA(6);
 
-                            if ( (LA31_184=='n') ) {
-                                int LA31_194 = input.LA(7);
+                            if ( (LA32_192=='n') ) {
+                                int LA32_203 = input.LA(7);
 
-                                if ( (LA31_194=='.'||(LA31_194>='0' && LA31_194<='9')||(LA31_194>='A' && LA31_194<='Z')||LA31_194=='_'||(LA31_194>='a' && LA31_194<='z')) ) {
-                                    alt31=46;
+                                if ( (LA32_203=='.'||(LA32_203>='0' && LA32_203<='9')||(LA32_203>='A' && LA32_203<='Z')||LA32_203=='_'||(LA32_203>='a' && LA32_203<='z')) ) {
+                                    alt32=47;
                                 }
                                 else {
-                                    alt31=13;}
+                                    alt32=13;}
                             }
                             else {
-                                alt31=46;}
+                                alt32=47;}
                         }
                         else {
-                            alt31=46;}
+                            alt32=47;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case '(':
             {
-            alt31=14;
+            alt32=15;
             }
             break;
         case ')':
             {
-            alt31=15;
+            alt32=16;
             }
             break;
         case '[':
             {
-            alt31=16;
+            alt32=17;
             }
             break;
         case ']':
             {
-            alt31=17;
+            alt32=18;
             }
             break;
         case '{':
             {
-            alt31=18;
+            alt32=19;
             }
             break;
         case '}':
             {
-            alt31=19;
+            alt32=20;
             }
             break;
         case ',':
         case ';':
             {
-            alt31=20;
+            alt32=21;
             }
             break;
         case '.':
             {
-            alt31=21;
+            alt32=22;
             }
             break;
         case '=':
             {
-            int LA31_25 = input.LA(2);
+            int LA32_25 = input.LA(2);
 
-            if ( (LA31_25=='=') ) {
-                alt31=26;
+            if ( (LA32_25=='=') ) {
+                alt32=27;
             }
             else {
-                alt31=22;}
+                alt32=23;}
             }
             break;
         case '<':
@@ -3199,130 +3304,130 @@
             switch ( input.LA(2) ) {
             case '-':
                 {
-                alt31=22;
+                alt32=23;
                 }
                 break;
             case '=':
                 {
-                alt31=31;
+                alt32=32;
                 }
                 break;
             default:
-                alt31=29;}
+                alt32=30;}
 
             }
             break;
         case '|':
             {
-            int LA31_27 = input.LA(2);
+            int LA32_27 = input.LA(2);
 
-            if ( (LA31_27=='|') ) {
-                alt31=23;
+            if ( (LA32_27=='|') ) {
+                alt32=24;
             }
             else {
-                alt31=32;}
+                alt32=33;}
             }
             break;
         case 'O':
             {
-            int LA31_28 = input.LA(2);
+            int LA32_28 = input.LA(2);
 
-            if ( (LA31_28=='R') ) {
-                int LA31_88 = input.LA(3);
+            if ( (LA32_28=='R') ) {
+                int LA32_90 = input.LA(3);
 
-                if ( (LA31_88=='.'||(LA31_88>='0' && LA31_88<='9')||(LA31_88>='A' && LA31_88<='Z')||LA31_88=='_'||(LA31_88>='a' && LA31_88<='z')) ) {
-                    alt31=46;
+                if ( (LA32_90=='.'||(LA32_90>='0' && LA32_90<='9')||(LA32_90>='A' && LA32_90<='Z')||LA32_90=='_'||(LA32_90>='a' && LA32_90<='z')) ) {
+                    alt32=47;
                 }
                 else {
-                    alt31=23;}
+                    alt32=24;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case 'o':
             {
-            int LA31_29 = input.LA(2);
+            int LA32_29 = input.LA(2);
 
-            if ( (LA31_29=='r') ) {
-                int LA31_89 = input.LA(3);
+            if ( (LA32_29=='r') ) {
+                int LA32_91 = input.LA(3);
 
-                if ( (LA31_89=='.'||(LA31_89>='0' && LA31_89<='9')||(LA31_89>='A' && LA31_89<='Z')||LA31_89=='_'||(LA31_89>='a' && LA31_89<='z')) ) {
-                    alt31=46;
+                if ( (LA32_91=='.'||(LA32_91>='0' && LA32_91<='9')||(LA32_91>='A' && LA32_91<='Z')||LA32_91=='_'||(LA32_91>='a' && LA32_91<='z')) ) {
+                    alt32=47;
                 }
                 else {
-                    alt31=23;}
+                    alt32=24;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case '&':
             {
-            int LA31_30 = input.LA(2);
+            int LA32_30 = input.LA(2);
 
-            if ( (LA31_30=='&') ) {
-                alt31=24;
+            if ( (LA32_30=='&') ) {
+                alt32=25;
             }
             else {
-                alt31=33;}
+                alt32=34;}
             }
             break;
         case 'A':
             {
-            int LA31_31 = input.LA(2);
+            int LA32_31 = input.LA(2);
 
-            if ( (LA31_31=='N') ) {
-                int LA31_92 = input.LA(3);
+            if ( (LA32_31=='N') ) {
+                int LA32_94 = input.LA(3);
 
-                if ( (LA31_92=='D') ) {
-                    int LA31_137 = input.LA(4);
+                if ( (LA32_94=='D') ) {
+                    int LA32_141 = input.LA(4);
 
-                    if ( (LA31_137=='.'||(LA31_137>='0' && LA31_137<='9')||(LA31_137>='A' && LA31_137<='Z')||LA31_137=='_'||(LA31_137>='a' && LA31_137<='z')) ) {
-                        alt31=46;
+                    if ( (LA32_141=='.'||(LA32_141>='0' && LA32_141<='9')||(LA32_141>='A' && LA32_141<='Z')||LA32_141=='_'||(LA32_141>='a' && LA32_141<='z')) ) {
+                        alt32=47;
                     }
                     else {
-                        alt31=24;}
+                        alt32=25;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case 'a':
             {
-            int LA31_32 = input.LA(2);
+            int LA32_32 = input.LA(2);
 
-            if ( (LA31_32=='n') ) {
-                int LA31_93 = input.LA(3);
+            if ( (LA32_32=='n') ) {
+                int LA32_95 = input.LA(3);
 
-                if ( (LA31_93=='d') ) {
-                    int LA31_138 = input.LA(4);
+                if ( (LA32_95=='d') ) {
+                    int LA32_142 = input.LA(4);
 
-                    if ( (LA31_138=='.'||(LA31_138>='0' && LA31_138<='9')||(LA31_138>='A' && LA31_138<='Z')||LA31_138=='_'||(LA31_138>='a' && LA31_138<='z')) ) {
-                        alt31=46;
+                    if ( (LA32_142=='.'||(LA32_142>='0' && LA32_142<='9')||(LA32_142>='A' && LA32_142<='Z')||LA32_142=='_'||(LA32_142>='a' && LA32_142<='z')) ) {
+                        alt32=47;
                     }
                     else {
-                        alt31=24;}
+                        alt32=25;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case '!':
             {
-            int LA31_33 = input.LA(2);
+            int LA32_33 = input.LA(2);
 
-            if ( (LA31_33=='=') ) {
-                alt31=27;
+            if ( (LA32_33=='=') ) {
+                alt32=28;
             }
             else {
-                alt31=25;}
+                alt32=26;}
             }
             break;
         case 'n':
@@ -3330,379 +3435,379 @@
             switch ( input.LA(2) ) {
             case 'o':
                 {
-                int LA31_96 = input.LA(3);
+                int LA32_98 = input.LA(3);
 
-                if ( (LA31_96=='t') ) {
-                    int LA31_139 = input.LA(4);
+                if ( (LA32_98=='t') ) {
+                    int LA32_143 = input.LA(4);
 
-                    if ( (LA31_139=='.'||(LA31_139>='0' && LA31_139<='9')||(LA31_139>='A' && LA31_139<='Z')||LA31_139=='_'||(LA31_139>='a' && LA31_139<='z')) ) {
-                        alt31=46;
+                    if ( (LA32_143=='.'||(LA32_143>='0' && LA32_143<='9')||(LA32_143>='A' && LA32_143<='Z')||LA32_143=='_'||(LA32_143>='a' && LA32_143<='z')) ) {
+                        alt32=47;
                     }
                     else {
-                        alt31=25;}
+                        alt32=26;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
             case 'e':
                 {
-                int LA31_97 = input.LA(3);
+                int LA32_99 = input.LA(3);
 
-                if ( (LA31_97=='q') ) {
-                    int LA31_140 = input.LA(4);
+                if ( (LA32_99=='q') ) {
+                    int LA32_144 = input.LA(4);
 
-                    if ( (LA31_140=='.'||(LA31_140>='0' && LA31_140<='9')||(LA31_140>='A' && LA31_140<='Z')||LA31_140=='_'||(LA31_140>='a' && LA31_140<='z')) ) {
-                        alt31=46;
+                    if ( (LA32_144=='.'||(LA32_144>='0' && LA32_144<='9')||(LA32_144>='A' && LA32_144<='Z')||LA32_144=='_'||(LA32_144>='a' && LA32_144<='z')) ) {
+                        alt32=47;
                     }
                     else {
-                        alt31=27;}
+                        alt32=28;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
             default:
-                alt31=46;}
+                alt32=47;}
 
             }
             break;
         case 'e':
             {
-            int LA31_35 = input.LA(2);
+            int LA32_35 = input.LA(2);
 
-            if ( (LA31_35=='q') ) {
-                int LA31_98 = input.LA(3);
+            if ( (LA32_35=='q') ) {
+                int LA32_100 = input.LA(3);
 
-                if ( (LA31_98=='.'||(LA31_98>='0' && LA31_98<='9')||(LA31_98>='A' && LA31_98<='Z')||LA31_98=='_'||(LA31_98>='a' && LA31_98<='z')) ) {
-                    alt31=46;
+                if ( (LA32_100=='.'||(LA32_100>='0' && LA32_100<='9')||(LA32_100>='A' && LA32_100<='Z')||LA32_100=='_'||(LA32_100>='a' && LA32_100<='z')) ) {
+                    alt32=47;
                 }
                 else {
-                    alt31=26;}
+                    alt32=27;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case '>':
             {
-            int LA31_36 = input.LA(2);
+            int LA32_36 = input.LA(2);
 
-            if ( (LA31_36=='=') ) {
-                alt31=30;
+            if ( (LA32_36=='=') ) {
+                alt32=31;
             }
             else {
-                alt31=28;}
+                alt32=29;}
             }
             break;
         case 'G':
             {
-            int LA31_37 = input.LA(2);
+            int LA32_37 = input.LA(2);
 
-            if ( (LA31_37=='T') ) {
-                int LA31_101 = input.LA(3);
+            if ( (LA32_37=='T') ) {
+                int LA32_103 = input.LA(3);
 
-                if ( (LA31_101=='.'||(LA31_101>='0' && LA31_101<='9')||(LA31_101>='A' && LA31_101<='Z')||LA31_101=='_'||(LA31_101>='a' && LA31_101<='z')) ) {
-                    alt31=46;
+                if ( (LA32_103=='.'||(LA32_103>='0' && LA32_103<='9')||(LA32_103>='A' && LA32_103<='Z')||LA32_103=='_'||(LA32_103>='a' && LA32_103<='z')) ) {
+                    alt32=47;
                 }
                 else {
-                    alt31=28;}
+                    alt32=29;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case 'g':
             {
             switch ( input.LA(2) ) {
-            case 'e':
+            case 't':
                 {
-                int LA31_102 = input.LA(3);
+                int LA32_104 = input.LA(3);
 
-                if ( (LA31_102=='q') ) {
-                    int LA31_141 = input.LA(4);
-
-                    if ( (LA31_141=='.'||(LA31_141>='0' && LA31_141<='9')||(LA31_141>='A' && LA31_141<='Z')||LA31_141=='_'||(LA31_141>='a' && LA31_141<='z')) ) {
-                        alt31=46;
-                    }
-                    else {
-                        alt31=30;}
+                if ( (LA32_104=='.'||(LA32_104>='0' && LA32_104<='9')||(LA32_104>='A' && LA32_104<='Z')||LA32_104=='_'||(LA32_104>='a' && LA32_104<='z')) ) {
+                    alt32=47;
                 }
                 else {
-                    alt31=46;}
+                    alt32=29;}
                 }
                 break;
-            case 't':
+            case 'e':
                 {
-                int LA31_103 = input.LA(3);
+                int LA32_105 = input.LA(3);
 
-                if ( (LA31_103=='.'||(LA31_103>='0' && LA31_103<='9')||(LA31_103>='A' && LA31_103<='Z')||LA31_103=='_'||(LA31_103>='a' && LA31_103<='z')) ) {
-                    alt31=46;
+                if ( (LA32_105=='q') ) {
+                    int LA32_145 = input.LA(4);
+
+                    if ( (LA32_145=='.'||(LA32_145>='0' && LA32_145<='9')||(LA32_145>='A' && LA32_145<='Z')||LA32_145=='_'||(LA32_145>='a' && LA32_145<='z')) ) {
+                        alt32=47;
+                    }
+                    else {
+                        alt32=31;}
                 }
                 else {
-                    alt31=28;}
+                    alt32=47;}
                 }
                 break;
             default:
-                alt31=46;}
+                alt32=47;}
 
             }
             break;
         case 'l':
             {
             switch ( input.LA(2) ) {
-            case 'e':
+            case 't':
                 {
-                int LA31_104 = input.LA(3);
+                int LA32_106 = input.LA(3);
 
-                if ( (LA31_104=='q') ) {
-                    int LA31_142 = input.LA(4);
-
-                    if ( (LA31_142=='.'||(LA31_142>='0' && LA31_142<='9')||(LA31_142>='A' && LA31_142<='Z')||LA31_142=='_'||(LA31_142>='a' && LA31_142<='z')) ) {
-                        alt31=46;
-                    }
-                    else {
-                        alt31=31;}
+                if ( (LA32_106=='.'||(LA32_106>='0' && LA32_106<='9')||(LA32_106>='A' && LA32_106<='Z')||LA32_106=='_'||(LA32_106>='a' && LA32_106<='z')) ) {
+                    alt32=47;
                 }
                 else {
-                    alt31=46;}
+                    alt32=30;}
                 }
                 break;
-            case 't':
+            case 'e':
                 {
-                int LA31_105 = input.LA(3);
+                int LA32_107 = input.LA(3);
 
-                if ( (LA31_105=='.'||(LA31_105>='0' && LA31_105<='9')||(LA31_105>='A' && LA31_105<='Z')||LA31_105=='_'||(LA31_105>='a' && LA31_105<='z')) ) {
-                    alt31=46;
+                if ( (LA32_107=='q') ) {
+                    int LA32_146 = input.LA(4);
+
+                    if ( (LA32_146=='.'||(LA32_146>='0' && LA32_146<='9')||(LA32_146>='A' && LA32_146<='Z')||LA32_146=='_'||(LA32_146>='a' && LA32_146<='z')) ) {
+                        alt32=47;
+                    }
+                    else {
+                        alt32=32;}
                 }
                 else {
-                    alt31=29;}
+                    alt32=47;}
                 }
                 break;
             default:
-                alt31=46;}
+                alt32=47;}
 
             }
             break;
         case '^':
             {
-            alt31=34;
+            alt32=35;
             }
             break;
         case '~':
             {
-            alt31=35;
+            alt32=36;
             }
             break;
         case '*':
             {
-            alt31=36;
+            alt32=37;
             }
             break;
         case '/':
             {
-            alt31=37;
+            alt32=38;
             }
             break;
         case 'd':
             {
-            int LA31_44 = input.LA(2);
+            int LA32_44 = input.LA(2);
 
-            if ( (LA31_44=='i') ) {
-                int LA31_106 = input.LA(3);
+            if ( (LA32_44=='i') ) {
+                int LA32_108 = input.LA(3);
 
-                if ( (LA31_106=='v') ) {
-                    int LA31_143 = input.LA(4);
+                if ( (LA32_108=='v') ) {
+                    int LA32_147 = input.LA(4);
 
-                    if ( (LA31_143=='i') ) {
-                        int LA31_165 = input.LA(5);
+                    if ( (LA32_147=='i') ) {
+                        int LA32_171 = input.LA(5);
 
-                        if ( (LA31_165=='d') ) {
-                            int LA31_185 = input.LA(6);
+                        if ( (LA32_171=='d') ) {
+                            int LA32_193 = input.LA(6);
 
-                            if ( (LA31_185=='e') ) {
-                                int LA31_195 = input.LA(7);
+                            if ( (LA32_193=='e') ) {
+                                int LA32_204 = input.LA(7);
 
-                                if ( (LA31_195=='.'||(LA31_195>='0' && LA31_195<='9')||(LA31_195>='A' && LA31_195<='Z')||LA31_195=='_'||(LA31_195>='a' && LA31_195<='z')) ) {
-                                    alt31=46;
+                                if ( (LA32_204=='.'||(LA32_204>='0' && LA32_204<='9')||(LA32_204>='A' && LA32_204<='Z')||LA32_204=='_'||(LA32_204>='a' && LA32_204<='z')) ) {
+                                    alt32=47;
                                 }
                                 else {
-                                    alt31=37;}
+                                    alt32=38;}
                             }
                             else {
-                                alt31=46;}
+                                alt32=47;}
                         }
                         else {
-                            alt31=46;}
+                            alt32=47;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case '-':
             {
-            int LA31_45 = input.LA(2);
+            int LA32_45 = input.LA(2);
 
-            if ( ((LA31_45>='0' && LA31_45<='9')) ) {
-                alt31=1;
+            if ( ((LA32_45>='0' && LA32_45<='9')) ) {
+                alt32=1;
             }
             else {
-                alt31=39;}
+                alt32=40;}
             }
             break;
         case 'P':
             {
-            int LA31_46 = input.LA(2);
+            int LA32_46 = input.LA(2);
 
-            if ( (LA31_46=='L') ) {
-                int LA31_108 = input.LA(3);
+            if ( (LA32_46=='L') ) {
+                int LA32_110 = input.LA(3);
 
-                if ( (LA31_108=='U') ) {
-                    int LA31_144 = input.LA(4);
+                if ( (LA32_110=='U') ) {
+                    int LA32_148 = input.LA(4);
 
-                    if ( (LA31_144=='S') ) {
-                        int LA31_166 = input.LA(5);
+                    if ( (LA32_148=='S') ) {
+                        int LA32_172 = input.LA(5);
 
-                        if ( (LA31_166=='.'||(LA31_166>='0' && LA31_166<='9')||(LA31_166>='A' && LA31_166<='Z')||LA31_166=='_'||(LA31_166>='a' && LA31_166<='z')) ) {
-                            alt31=46;
+                        if ( (LA32_172=='.'||(LA32_172>='0' && LA32_172<='9')||(LA32_172>='A' && LA32_172<='Z')||LA32_172=='_'||(LA32_172>='a' && LA32_172<='z')) ) {
+                            alt32=47;
                         }
                         else {
-                            alt31=38;}
+                            alt32=39;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case 'p':
             {
-            int LA31_47 = input.LA(2);
+            int LA32_47 = input.LA(2);
 
-            if ( (LA31_47=='l') ) {
-                int LA31_109 = input.LA(3);
+            if ( (LA32_47=='l') ) {
+                int LA32_111 = input.LA(3);
 
-                if ( (LA31_109=='u') ) {
-                    int LA31_145 = input.LA(4);
+                if ( (LA32_111=='u') ) {
+                    int LA32_149 = input.LA(4);
 
-                    if ( (LA31_145=='s') ) {
-                        int LA31_167 = input.LA(5);
+                    if ( (LA32_149=='s') ) {
+                        int LA32_173 = input.LA(5);
 
-                        if ( (LA31_167=='.'||(LA31_167>='0' && LA31_167<='9')||(LA31_167>='A' && LA31_167<='Z')||LA31_167=='_'||(LA31_167>='a' && LA31_167<='z')) ) {
-                            alt31=46;
+                        if ( (LA32_173=='.'||(LA32_173>='0' && LA32_173<='9')||(LA32_173>='A' && LA32_173<='Z')||LA32_173=='_'||(LA32_173>='a' && LA32_173<='z')) ) {
+                            alt32=47;
                         }
                         else {
-                            alt31=38;}
+                            alt32=39;}
                     }
                     else {
-                        alt31=46;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
             }
             else {
-                alt31=46;}
+                alt32=47;}
             }
             break;
         case 'm':
             {
             switch ( input.LA(2) ) {
-            case 'i':
+            case 'o':
                 {
-                int LA31_110 = input.LA(3);
+                int LA32_112 = input.LA(3);
 
-                if ( (LA31_110=='n') ) {
-                    int LA31_146 = input.LA(4);
+                if ( (LA32_112=='d') ) {
+                    int LA32_150 = input.LA(4);
 
-                    if ( (LA31_146=='u') ) {
-                        int LA31_168 = input.LA(5);
-
-                        if ( (LA31_168=='s') ) {
-                            int LA31_186 = input.LA(6);
-
-                            if ( (LA31_186=='.'||(LA31_186>='0' && LA31_186<='9')||(LA31_186>='A' && LA31_186<='Z')||LA31_186=='_'||(LA31_186>='a' && LA31_186<='z')) ) {
-                                alt31=46;
-                            }
-                            else {
-                                alt31=39;}
-                        }
-                        else {
-                            alt31=46;}
+                    if ( (LA32_150=='.'||(LA32_150>='0' && LA32_150<='9')||(LA32_150>='A' && LA32_150<='Z')||LA32_150=='_'||(LA32_150>='a' && LA32_150<='z')) ) {
+                        alt32=47;
                     }
                     else {
-                        alt31=46;}
+                        alt32=41;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
-            case 'o':
+            case 'i':
                 {
-                int LA31_111 = input.LA(3);
+                int LA32_113 = input.LA(3);
 
-                if ( (LA31_111=='d') ) {
-                    int LA31_147 = input.LA(4);
+                if ( (LA32_113=='n') ) {
+                    int LA32_151 = input.LA(4);
 
-                    if ( (LA31_147=='.'||(LA31_147>='0' && LA31_147<='9')||(LA31_147>='A' && LA31_147<='Z')||LA31_147=='_'||(LA31_147>='a' && LA31_147<='z')) ) {
-                        alt31=46;
+                    if ( (LA32_151=='u') ) {
+                        int LA32_174 = input.LA(5);
+
+                        if ( (LA32_174=='s') ) {
+                            int LA32_194 = input.LA(6);
+
+                            if ( (LA32_194=='.'||(LA32_194>='0' && LA32_194<='9')||(LA32_194>='A' && LA32_194<='Z')||LA32_194=='_'||(LA32_194>='a' && LA32_194<='z')) ) {
+                                alt32=47;
+                            }
+                            else {
+                                alt32=40;}
+                        }
+                        else {
+                            alt32=47;}
                     }
                     else {
-                        alt31=40;}
+                        alt32=47;}
                 }
                 else {
-                    alt31=46;}
+                    alt32=47;}
                 }
                 break;
             default:
-                alt31=46;}
+                alt32=47;}
 
             }
             break;
         case '%':
             {
-            alt31=40;
+            alt32=41;
             }
             break;
         case '?':
             {
-            alt31=41;
+            alt32=42;
             }
             break;
         case ':':
             {
-            alt31=42;
+            alt32=43;
             }
             break;
         case '\'':
             {
-            int LA31_52 = input.LA(2);
+            int LA32_52 = input.LA(2);
 
-            if ( (LA31_52=='\t'||LA31_52=='\r'||(LA31_52>=' ' && LA31_52<='~')) ) {
-                alt31=46;
+            if ( (LA32_52=='\t'||LA32_52=='\r'||(LA32_52>=' ' && LA32_52<='~')) ) {
+                alt32=47;
             }
             else {
-                alt31=43;}
+                alt32=44;}
             }
             break;
         case '\"':
             {
-            int LA31_53 = input.LA(2);
+            int LA32_53 = input.LA(2);
 
-            if ( (LA31_53=='\t'||LA31_53=='\r'||(LA31_53>=' ' && LA31_53<='~')) ) {
-                alt31=45;
+            if ( (LA32_53=='\t'||LA32_53=='\r'||(LA32_53>=' ' && LA32_53<='~')) ) {
+                alt32=46;
             }
             else {
-                alt31=44;}
+                alt32=45;}
             }
             break;
         case 'H':
@@ -3732,12 +3837,12 @@
         case 'y':
         case 'z':
             {
-            alt31=46;
+            alt32=47;
             }
             break;
         case '$':
             {
-            alt31=47;
+            alt32=48;
             }
             break;
         case '\t':
@@ -3745,17 +3850,17 @@
         case '\r':
         case ' ':
             {
-            alt31=48;
+            alt32=49;
             }
             break;
         default:
             NoViableAltException nvae =
-                new NoViableAltException("1:1: Tokens : ( NUMBER | BIND | IF | DO | RULE | CLASS | METHOD | LINE | ENDRULE | NOTHING | TRUE | FALSE | RETURN | LPAREN | RPAREN | LSQUARE | RSQUARE | LBRACE | RBRACE | SEPR | DOT | ASSIGN | OR | AND | NOT | EQ | NEQ | GT | LT | GEQ | LEQ | BOR | BAND | BXOR | TWIDDLE | MUL | DIV | PLUS | MINUS | MOD | TERN_IF | COLON | QUOTE | DQUOTE | STRING | SYMBOL | DOLLARSYM | WS );", 31, 0, input);
+                new NoViableAltException("1:1: Tokens : ( NUMBER | BIND | IF | DO | RULE | CLASS | METHOD | LINE | ENDRULE | NOTHING | TRUE | FALSE | RETURN | THROW | LPAREN | RPAREN | LSQUARE | RSQUARE | LBRACE | RBRACE | SEPR | DOT | ASSIGN | OR | AND | NOT | EQ | NEQ | GT | LT | GEQ | LEQ | BOR | BAND | BXOR | TWIDDLE | MUL | DIV | PLUS | MINUS | MOD | TERN_IF | COLON | QUOTE | DQUOTE | STRING | SYMBOL | DOLLARSYM | WS );", 32, 0, input);
 
             throw nvae;
         }
 
-        switch (alt31) {
+        switch (alt32) {
             case 1 :
                 // dd/grammar/ECAToken.g:1:10: NUMBER
                 {
@@ -3848,246 +3953,253 @@
                 }
                 break;
             case 14 :
-                // dd/grammar/ECAToken.g:1:85: LPAREN
+                // dd/grammar/ECAToken.g:1:85: THROW
                 {
-                mLPAREN(); 
+                mTHROW(); 
 
                 }
                 break;
             case 15 :
-                // dd/grammar/ECAToken.g:1:92: RPAREN
+                // dd/grammar/ECAToken.g:1:91: LPAREN
                 {
-                mRPAREN(); 
+                mLPAREN(); 
 
                 }
                 break;
             case 16 :
-                // dd/grammar/ECAToken.g:1:99: LSQUARE
+                // dd/grammar/ECAToken.g:1:98: RPAREN
                 {
-                mLSQUARE(); 
+                mRPAREN(); 
 
                 }
                 break;
             case 17 :
-                // dd/grammar/ECAToken.g:1:107: RSQUARE
+                // dd/grammar/ECAToken.g:1:105: LSQUARE
                 {
-                mRSQUARE(); 
+                mLSQUARE(); 
 
                 }
                 break;
             case 18 :
-                // dd/grammar/ECAToken.g:1:115: LBRACE
+                // dd/grammar/ECAToken.g:1:113: RSQUARE
                 {
-                mLBRACE(); 
+                mRSQUARE(); 
 
                 }
                 break;
             case 19 :
-                // dd/grammar/ECAToken.g:1:122: RBRACE
+                // dd/grammar/ECAToken.g:1:121: LBRACE
                 {
-                mRBRACE(); 
+                mLBRACE(); 
 
                 }
                 break;
             case 20 :
-                // dd/grammar/ECAToken.g:1:129: SEPR
+                // dd/grammar/ECAToken.g:1:128: RBRACE
                 {
-                mSEPR(); 
+                mRBRACE(); 
 
                 }
                 break;
             case 21 :
-                // dd/grammar/ECAToken.g:1:134: DOT
+                // dd/grammar/ECAToken.g:1:135: SEPR
                 {
-                mDOT(); 
+                mSEPR(); 
 
                 }
                 break;
             case 22 :
-                // dd/grammar/ECAToken.g:1:138: ASSIGN
+                // dd/grammar/ECAToken.g:1:140: DOT
                 {
-                mASSIGN(); 
+                mDOT(); 
 
                 }
                 break;
             case 23 :
-                // dd/grammar/ECAToken.g:1:145: OR
+                // dd/grammar/ECAToken.g:1:144: ASSIGN
                 {
-                mOR(); 
+                mASSIGN(); 
 
                 }
                 break;
             case 24 :
-                // dd/grammar/ECAToken.g:1:148: AND
+                // dd/grammar/ECAToken.g:1:151: OR
                 {
-                mAND(); 
+                mOR(); 
 
                 }
                 break;
             case 25 :
-                // dd/grammar/ECAToken.g:1:152: NOT
+                // dd/grammar/ECAToken.g:1:154: AND
                 {
-                mNOT(); 
+                mAND(); 
 
                 }
                 break;
             case 26 :
-                // dd/grammar/ECAToken.g:1:156: EQ
+                // dd/grammar/ECAToken.g:1:158: NOT
                 {
-                mEQ(); 
+                mNOT(); 
 
                 }
                 break;
             case 27 :
-                // dd/grammar/ECAToken.g:1:159: NEQ
+                // dd/grammar/ECAToken.g:1:162: EQ
                 {
-                mNEQ(); 
+                mEQ(); 
 
                 }
                 break;
             case 28 :
-                // dd/grammar/ECAToken.g:1:163: GT
+                // dd/grammar/ECAToken.g:1:165: NEQ
                 {
-                mGT(); 
+                mNEQ(); 
 
                 }
                 break;
             case 29 :
-                // dd/grammar/ECAToken.g:1:166: LT
+                // dd/grammar/ECAToken.g:1:169: GT
                 {
-                mLT(); 
+                mGT(); 
 
                 }
                 break;
             case 30 :
-                // dd/grammar/ECAToken.g:1:169: GEQ
+                // dd/grammar/ECAToken.g:1:172: LT
                 {
-                mGEQ(); 
+                mLT(); 
 
                 }
                 break;
             case 31 :
-                // dd/grammar/ECAToken.g:1:173: LEQ
+                // dd/grammar/ECAToken.g:1:175: GEQ
                 {
-                mLEQ(); 
+                mGEQ(); 
 
                 }
                 break;
             case 32 :
-                // dd/grammar/ECAToken.g:1:177: BOR
+                // dd/grammar/ECAToken.g:1:179: LEQ
                 {
-                mBOR(); 
+                mLEQ(); 
 
                 }
                 break;
             case 33 :
-                // dd/grammar/ECAToken.g:1:181: BAND
+                // dd/grammar/ECAToken.g:1:183: BOR
                 {
-                mBAND(); 
+                mBOR(); 
 
                 }
                 break;
             case 34 :
-                // dd/grammar/ECAToken.g:1:186: BXOR
+                // dd/grammar/ECAToken.g:1:187: BAND
                 {
-                mBXOR(); 
+                mBAND(); 
 
                 }
                 break;
             case 35 :
-                // dd/grammar/ECAToken.g:1:191: TWIDDLE
+                // dd/grammar/ECAToken.g:1:192: BXOR
                 {
-                mTWIDDLE(); 
+                mBXOR(); 
 
                 }
                 break;
             case 36 :
-                // dd/grammar/ECAToken.g:1:199: MUL
+                // dd/grammar/ECAToken.g:1:197: TWIDDLE
                 {
-                mMUL(); 
+                mTWIDDLE(); 
 
                 }
                 break;
             case 37 :
-                // dd/grammar/ECAToken.g:1:203: DIV
+                // dd/grammar/ECAToken.g:1:205: MUL
                 {
-                mDIV(); 
+                mMUL(); 
 
                 }
                 break;
             case 38 :
-                // dd/grammar/ECAToken.g:1:207: PLUS
+                // dd/grammar/ECAToken.g:1:209: DIV
                 {
-                mPLUS(); 
+                mDIV(); 
 
                 }
                 break;
             case 39 :
-                // dd/grammar/ECAToken.g:1:212: MINUS
+                // dd/grammar/ECAToken.g:1:213: PLUS
                 {
-                mMINUS(); 
+                mPLUS(); 
 
                 }
                 break;
             case 40 :
-                // dd/grammar/ECAToken.g:1:218: MOD
+                // dd/grammar/ECAToken.g:1:218: MINUS
                 {
-                mMOD(); 
+                mMINUS(); 
 
                 }
                 break;
             case 41 :
-                // dd/grammar/ECAToken.g:1:222: TERN_IF
+                // dd/grammar/ECAToken.g:1:224: MOD
                 {
-                mTERN_IF(); 
+                mMOD(); 
 
                 }
                 break;
             case 42 :
-                // dd/grammar/ECAToken.g:1:230: COLON
+                // dd/grammar/ECAToken.g:1:228: TERN_IF
                 {
-                mCOLON(); 
+                mTERN_IF(); 
 
                 }
                 break;
             case 43 :
-                // dd/grammar/ECAToken.g:1:236: QUOTE
+                // dd/grammar/ECAToken.g:1:236: COLON
                 {
-                mQUOTE(); 
+                mCOLON(); 
 
                 }
                 break;
             case 44 :
-                // dd/grammar/ECAToken.g:1:242: DQUOTE
+                // dd/grammar/ECAToken.g:1:242: QUOTE
                 {
-                mDQUOTE(); 
+                mQUOTE(); 
 
                 }
                 break;
             case 45 :
-                // dd/grammar/ECAToken.g:1:249: STRING
+                // dd/grammar/ECAToken.g:1:248: DQUOTE
                 {
-                mSTRING(); 
+                mDQUOTE(); 
 
                 }
                 break;
             case 46 :
-                // dd/grammar/ECAToken.g:1:256: SYMBOL
+                // dd/grammar/ECAToken.g:1:255: STRING
                 {
-                mSYMBOL(); 
+                mSTRING(); 
 
                 }
                 break;
             case 47 :
-                // dd/grammar/ECAToken.g:1:263: DOLLARSYM
+                // dd/grammar/ECAToken.g:1:262: SYMBOL
                 {
-                mDOLLARSYM(); 
+                mSYMBOL(); 
 
                 }
                 break;
             case 48 :
-                // dd/grammar/ECAToken.g:1:273: WS
+                // dd/grammar/ECAToken.g:1:269: DOLLARSYM
                 {
+                mDOLLARSYM(); 
+
+                }
+                break;
+            case 49 :
+                // dd/grammar/ECAToken.g:1:279: WS
+                {
                 mWS(); 
 
                 }
@@ -4099,7 +4211,7 @@
 
 
     protected DFA6 dfa6 = new DFA6(this);
-    protected DFA28 dfa28 = new DFA28(this);
+    protected DFA29 dfa29 = new DFA29(this);
     static final String DFA6_eotS =
         "\2\uffff\2\4\2\uffff\1\4";
     static final String DFA6_eofS =
@@ -4155,19 +4267,19 @@
             return "41:1: NUMBER : ( INTEGER | FLOAT );";
         }
     }
-    static final String DFA28_eotS =
+    static final String DFA29_eotS =
         "\1\uffff\2\3\2\uffff";
-    static final String DFA28_eofS =
+    static final String DFA29_eofS =
         "\5\uffff";
-    static final String DFA28_minS =
+    static final String DFA29_minS =
         "\1\101\2\56\2\uffff";
-    static final String DFA28_maxS =
+    static final String DFA29_maxS =
         "\3\172\2\uffff";
-    static final String DFA28_acceptS =
+    static final String DFA29_acceptS =
         "\3\uffff\1\2\1\1";
-    static final String DFA28_specialS =
+    static final String DFA29_specialS =
         "\5\uffff}>";
-    static final String[] DFA28_transitionS = {
+    static final String[] DFA29_transitionS = {
             "\32\1\4\uffff\1\1\1\uffff\32\1",
             "\1\4\1\uffff\12\2\7\uffff\32\2\4\uffff\1\2\1\uffff\32\2",
             "\1\4\1\uffff\12\2\7\uffff\32\2\4\uffff\1\2\1\uffff\32\2",
@@ -4175,37 +4287,37 @@
             ""
     };
 
-    static final short[] DFA28_eot = DFA.unpackEncodedString(DFA28_eotS);
-    static final short[] DFA28_eof = DFA.unpackEncodedString(DFA28_eofS);
-    static final char[] DFA28_min = DFA.unpackEncodedStringToUnsignedChars(DFA28_minS);
-    static final char[] DFA28_max = DFA.unpackEncodedStringToUnsignedChars(DFA28_maxS);
-    static final short[] DFA28_accept = DFA.unpackEncodedString(DFA28_acceptS);
-    static final short[] DFA28_special = DFA.unpackEncodedString(DFA28_specialS);
-    static final short[][] DFA28_transition;
+    static final short[] DFA29_eot = DFA.unpackEncodedString(DFA29_eotS);
+    static final short[] DFA29_eof = DFA.unpackEncodedString(DFA29_eofS);
+    static final char[] DFA29_min = DFA.unpackEncodedStringToUnsignedChars(DFA29_minS);
+    static final char[] DFA29_max = DFA.unpackEncodedStringToUnsignedChars(DFA29_maxS);
+    static final short[] DFA29_accept = DFA.unpackEncodedString(DFA29_acceptS);
+    static final short[] DFA29_special = DFA.unpackEncodedString(DFA29_specialS);
+    static final short[][] DFA29_transition;
 
     static {
-        int numStates = DFA28_transitionS.length;
-        DFA28_transition = new short[numStates][];
+        int numStates = DFA29_transitionS.length;
+        DFA29_transition = new short[numStates][];
         for (int i=0; i<numStates; i++) {
-            DFA28_transition[i] = DFA.unpackEncodedString(DFA28_transitionS[i]);
+            DFA29_transition[i] = DFA.unpackEncodedString(DFA29_transitionS[i]);
         }
     }
 
-    class DFA28 extends DFA {
+    class DFA29 extends DFA {
 
-        public DFA28(BaseRecognizer recognizer) {
+        public DFA29(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 28;
-            this.eot = DFA28_eot;
-            this.eof = DFA28_eof;
-            this.min = DFA28_min;
-            this.max = DFA28_max;
-            this.accept = DFA28_accept;
-            this.special = DFA28_special;
-            this.transition = DFA28_transition;
+            this.decisionNumber = 29;
+            this.eot = DFA29_eot;
+            this.eof = DFA29_eof;
+            this.min = DFA29_min;
+            this.max = DFA29_max;
+            this.accept = DFA29_accept;
+            this.special = DFA29_special;
+            this.transition = DFA29_transition;
         }
         public String getDescription() {
-            return "256:1: fragment DOTSYM : ( BARESYM DOT DOTSYM | BARESYM );";
+            return "259:1: fragment DOTSYM : ( BARESYM DOT DOTSYM | BARESYM );";
         }
     }
  

Modified: labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/type/TypeGroup.java
===================================================================
--- labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/type/TypeGroup.java	2008-09-30 13:06:38 UTC (rev 23222)
+++ labs/jbosstm/workspace/adinn/orchestration/src/org/jboss/jbossts/orchestration/rule/type/TypeGroup.java	2008-09-30 13:44:48 UTC (rev 23223)
@@ -1,6 +1,8 @@
 package org.jboss.jbossts.orchestration.rule.type;
 
 import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
 
 /**
  * the collection of types associated with an ECA rule
@@ -9,6 +11,7 @@
     protected HashMap<String, Type> typeTable;
     private ClassLoader loader;
     private boolean resolve;
+    private List<Type> exceptionTypes;
 
     /**
      * create a type group for a rule containing all the basic types
@@ -53,6 +56,7 @@
 
         this.loader = loader;
         this.resolve = false;
+        exceptionTypes = new ArrayList<Type>();
     }
 
     /**
@@ -194,6 +198,17 @@
         return arrayType;
     }
 
+    public void addExceptionTypes(String[] exceptionTypeNames) {
+        for (String exceptionTypeName : exceptionTypeNames) {
+            exceptionTypes.add(create(TypeHelper.internalizeClass(exceptionTypeName)));
+        }
+    }
+
+    public List<Type> getExceptionTypes()
+    {
+        return exceptionTypes;
+    }
+
     public Type ensureType(Class clazz)
     {
         if (clazz.isArray()) {




More information about the jboss-svn-commits mailing list